我正在设计一个具有以下要求的数据库:
- 一个组织可以独立存在
- 一个组织可以有任意多个不同的期限(日期范围)
- 一个组织可以有任意多个调查类型(学生、教师、家长等)
- 一个调查表单会被指定一个期限和调查类型
一个可能的结构如下所示:
组织机构
- OrganizationId INT IDENTITY(1,1) NOT NULL PRIMARY KEY
术语
- TermId INT IDENTITY(1,1) NOT NULL PRIMARY KEY
- OrganizationId INT NOT NULL REFERENCES Organization(OrganizationId)
调查类型
- SurveyTypeId IDENTITY(1,1) NOT NULL PRIMARY KEY
- OrganizationId INT NOT NULL REFERENCES Organization(OrganizationId)
调查表单
- SurveyFormId INT IDENTITY(1,1) NOT NULL PRIMARY KEY
- SurveyTypeId INT NOT NULL REFERENCES SurveyType(SurveyTypeId)
- TermId INT NOT NULL REFERENCES Term(TermId)
该结构符合当前流行的单一代理主键的强调。但是,该结构牺牲了数据完整性,因为
SurveyForm
记录很容易来自于不同的Organization
,拥有相同的TermId
或SurveyTypeId
。为了解决数据完整性问题,似乎需要添加
OrganizationId
并在组合键(OrganizationId,SurveyTypeId)
和(OrganizationId,TermId)
中使用它。这在本例中还算可以接受,但当模式变得更加完整时,组合键的大小将会增加。因此,我的问题是:人们现在通常如何处理这个问题(大多数在线参考资料都是来自2008年,当时可能存在不同的数据库设计关注点)?作为一个推论,什么时候向表中添加外键以减少常见表达式的连接表数量是可以接受的呢?