【发布时间】:2018-12-15 23:09:31
【问题描述】:
让我们跳到一个例子,说明一个表引用多个表:
CREATE TABLE Corses
(
ID int PRIMARY KEY,
.....
)
CREATE TABLE Questions
(
ID int PRIMARY KEY,
.....
)
CREATE TABLE Answers
(
ID int PRIMARY KEY,
.....
)
CREATE TABLE Files
(
ID INT PRIMARY KEY,
Corse_ID INT,
Question_ID INT,
Answer_ID INT,
FOREIGN KEY (Corse_ID) REFERENCES Corses(ID),
FOREIGN KEY (Question_ID) REFERENCES Questions(ID),
FOREIGN KEY (Answer_ID) REFERENCES Answers(ID)
)
上面的例子说明了一个学习应用程序中对其他对象(corses,问题和答案)的文件属性,所有对象的业务规则都是相同的,如下所示:
- 文件必须附加到单个对象并且只能附加到单个对象
- 一个对象可以没有或有很多文件附加到它上面 这使其成为一对多关系,并如上所示。
我的问题:
1。 当业务规则为 1-Many 时,这会使文件出现的其他外键列过时,例如,如果文件附加到屏幕截图之类的问题,则它仅附加到该问题,而不附加到答案而不是附加到死神。 每次出现实际上只使用一个外键。 必须有更好的方法来模拟这种情况。 还有其他方法可以实现更好的设计吗?
2。 当添加基于相同业务规则的多个 1-Many 关系并且子表必须依赖于父表中的行(文件必须附加到对象)时,我无法添加“NOT NULL”约束来强制执行此操作规则,因为我不知道我的文件将附加到哪个对象。 如何实现?
【问题讨论】:
-
您的业务规则在没有上下文的情况下意义不大。没有人知道您的规则中的“对象”指的是什么。并且实体“文件”没有似乎与其他实体相关的名称 - 这增加了混乱。但是,您的 DDL 似乎非常不完整。定义主键(可能是合成键)是不够的。一个特定的问题通常有一个特定的答案——通常超过 1 个用于测验目的。然而,这种关系没有被捕捉到。我认为您在尝试定义“文件”之前还有更多工作要做。
-
我的业务规则是能够将文件附加到对象,其中对象指的是尸体、问题或答案。对于理解我的问题,DDL 并不完整(DDL 的其余部分无助于更好地理解我的问题)。
标签: sql-server database-design foreign-keys relational-database entity-relationship