簡體   English   中英

SQL表中兩個條目之間的關聯

[英]Association between two entries in SQL table

想象一下,您有一個存儲人員列表的數據庫表。 你想在人與人之間建立一種關系,即我與人J的朋友。

我想在這種情況下,需要第二個表來存儲人員關聯。 該表包含兩個字段(person1,person2),每個條目對應兩個人之間的一對一關系。

這是對的還是有更聰明的方法呢? 此方法使關聯表像n_users ^ 2一樣縮放。

1.對於一對一的關系:

例如,表UserInfo(用於用戶的個人信息)和表UserCredential(用於用戶的登錄信息)。 這是表拆分,以減少一條記錄的大小。

為每個表指定相同的主鍵,並從一個(輔助表)到另一個(主表)創建外鍵:

UserInfo(#UserID);
UserCredential(#UserID)
    FOREIGN KEY (UserID) REFERENCES UserInfo(UserID);

帶有前綴“#”的列是表的主鍵。

2.對於多對一關系:

例如表員工和表部門。 每個員工只屬於一個部門,但部門可能有零到多個員工。

將表Department的主鍵列添加到表Employee中,並從Emp到Dep創建一個FK:

Department(#DepartmentID);
Employee(#EmployeeID, DepartmentID)
    FOREIGN KEY (DepartmentID) REFERENCES Department(DepartmentID);

如果您經常需要使用Employee.DepartmentID列進行查詢,則可以在其上創建索引:

CREATE INDEX IX_Employee_DepartmentID ON Employee(DepartmentID);

3.對於多對多關系:

例如表用戶和自己。 用戶可以與另一個用戶成為朋友,友誼是雙向的(A是B的朋友,所以B也是A的朋友)。 並且用戶可以跟隨另一個用戶,但以下是單向的(A跟隨B但B可能不跟隨A同時)。 在圖論中,友誼是無向圖,以下是有向圖。

需要一個單獨的表來表示多對多關系:

User(#UserID);
Friendship(#LeftUserID, #RightUserID)
    FOREIGN KEY (LeftUserID) REFERENCES User(UserID)
    FOREIGN KEY (RightUserID) REFERENCES User(UserID)
    CHECK (LeftUserID < RightUserID);
Following(#LeftUserID, #RightUserID)
    FOREIGN KEY (LeftUserID) REFERENCES User(UserID)
    FOREIGN KEY (RightUserID) REFERENCES User(UserID)
    CHECK (LeftUserID <> RightUserID);

表Friendship和Following都使用組合主鍵(具有兩列或更多列)。

表Friendship禁止記錄的檢查約束如下:

  • (A,A):一個人不應該是自己的朋友。
  • (B,A):對於A和B之間的友誼,記錄(A,B)就足夠了。 這是DRY原則的一個例子。

表中的檢查約束僅禁止像(A,A)這樣的記錄。 (A,B)表示A跟隨B,(B,A)表示B跟隨A,這兩個記錄具有不同的含義,因此它們都是必要的。

您可以使用第二列創建其他索引來優化查詢(假設PK是聚簇索引):

CREATE UNIQUE INDEX IX_Friendship_Right_Left
    ON Friendship(RightUserID, LeftUserID);
CREATE UNIQUE INDEX IX_Following_Right_Left
    ON Following(RightUserID, LeftUserID);

是的,如果您想建立多對多關系,這是正確的。 這就是所有人都可以擁有很多朋友。

如果你有一對多關系,就像所有人都有一個老板(或沒有老板)你不需要額外的表,那么你只需要人員表中的BossId列。

您可能還想建立關聯類型。 在這種情況下,您最好使用2個表,RelationshipTypes和Relationships。 唯一鍵可以在所有3個關系字段上。

Relationships
  PersonId
  RelatedPersonId
  RelationshipTypeId

RelationsShipTypes
  Id
  Name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM