我看到它的方式,你必須有幾個實體
CREATE TABLE StudentType
(
Id Int PRIMARY KEY,
Name NVarChar(50)
);
INSERT StudentType VALUES
(
(1, 'Basic'),
(2, 'Advanced'),
(3, 'SomeOtherCategory')
);
CREATE TABLE Student
(
Id Int PRIMARY KEY,
Name NVarChar(200),
OtherAttributeCommonToAllStudents Int,
Type Int,
CONSTRAINT FK_Student_StudentType
FOREIGN KEY (Type) REFERENCES StudentType(Id)
)
CREATE TABLE StudentAdvanced
(
Id Int PRIMARY KEY,
AdvancedOnlyAttribute Int,
CONSTRIANT FK_StudentAdvanced_Student
FOREIGN KEY (Id) REFERENCES Student(Id)
)
CREATE TABLE StudentSomeOtherCategory
(
Id Int PRIMARY KEY,
SomeOtherCategoryOnlyAttribute Int,
CONSTRIANT FK_StudentSomeOtherCategory_Student
FOREIGN KEY (Id) REFERENCES Student(Id)
)
- 通用於所有的學生對
Student
表列的任何屬性。
- 具有額外屬性的學生類型被添加到
StudentType
表中。
- 每個額外的學生類型都會得到一個
Student<TypeName>
表來存儲其特定屬性。這些表格與Student
有可選的一對一關係。
我認爲你的「稻草人」聯結表是EAV反模式的一個部分實現,唯一一個這是明智的,當你不知道你需要建模什麼屬性時,即你的數據將完全沒有結構化。當這是一個真正的需求時,關係數據庫開始看起來不太理想。在這些場合,請考慮使用NOSQL/Document數據庫替代方案。
接點表在以下情況下將會很有用。假設我們向模型中添加一個Class實體。
CREATE TABLE Class
(
Id Int PRIMARY KEY,
...
)
它的concievable,我們想存儲學生和班級之間的多對多realtionship。
CREATE TABLE Registration
(
Id Int PRIMARY KEY,
StudentId Int,
ClassId Int,
CONSTRAINT FK_Registration_Student
FOREIGN KEY (StudentId) REFERENCES Student(Id),
CONSTRAINT FK_Registration_Class
FOREIGN KEY (ClassId) REFERENCES Class(Id)
)
這個實體可能是存儲與學生的註冊相關的屬性的正確地方,例如可能是完成標誌。其他數據自然會與這個交匯點相關,也可能是特定類別的出勤記錄或成績歷史記錄。
如果您不以這種方式與Class
和Student
相關聯,您將如何選擇兩個,一個班級的所有學生以及一個學生閱讀的所有班級。性能方面,這可以通過關鍵列上的索引輕鬆優化。
當多對多的realtionships存在沒有任何屬性我同意在邏輯上,結表不需要存在。然而,在關係數據庫中,結表仍然是一個有用的物理implmentaion,也許是這樣的,
CREATE TABLE StudentClass
(
StudentId Int,
ClassId Int,
CONSTRAINT PK_StudentClass PRIMARY KEY (ClassId, StudentId),
CONSTRAINT FK_Registration_Student
FOREIGN KEY (StudentId) REFERENCES Student(Id),
CONSTRAINT FK_Registration_Class
FOREIGN KEY (ClassId) REFERENCES Class(Id)
)
這讓像
// students in a class?
SELECT StudentId
FROM StudentClass
WHERE ClassId = @classId
// classes read by a student?
SELECT ClassId
FROM StudentClass
WHERE StudentId = @studentId
additionaly簡單的查詢,這使得一個簡單的方法來管理的關係部分或全部來自任何方面,這將與關係數據庫開發人員熟悉,並且可以被查詢優化人員使用。
所以,你想存儲非規範化的數據在關係數據庫? – Jodrell
我想了解計算成本環境中聯結表的功能點,而不一定是含糊不清的術語「關係數據庫」。我不想重申我想了解這一點的整個背景,因爲那只是重申了這個問題。 – MetaChrome
TL; DR--你如何在數據庫中存儲N-N關係,特別是當關系雙方有數百條記錄時? – Arvo