我怎样才能摆脱间接的"外键?我应该吗?

时间:2015-10-17 16:55:24

标签: database database-design relational-database

这是一个示例模式,用于说明我在谈论的内容:

sample database schema

让我们说我存储有关某些活动(研讨会,培训,等等)的信息,这些活动在某些地点(由黑客,游泳池等)和城市确定。每个活动都发生在合适类型的所有位置一次(例如,任何编程研讨会一次发生在所有黑客空间),因此任何人都可以选择参加任​​何合适的活动位置。因此,任何活动仅与某些位置类型相关联,而出勤记录与某些活动相关联(因此与某些位置类型隐含关联)以及此特定用户参与活动的城市。

到目前为止,系统中最常见的查询是生成一个由给定人员参加的所有活动的报告。

我觉得这很难看吗?我应该尝试重新设计这个,如果是的话,怎么样?

P.S。我宁愿不透露存储在数据库中的实际数据,我必须采用类似的设计,所以我希望这个比喻有道理。

1 个答案:

答案 0 :(得分:1)

听起来您需要一个包含位置类型列表的LocationTypes表。然后,Location可以与LocationTypes建立外键关系。

但是,我不想假设这些地点不会随着时间的推移而改变。所以这过于简单化了。所以,我会有另一个像LocationSets这样的实体,它会列出给定活动随时间的位置。 LocationSets将包含"类型"可以使用。与位置集关联的位置将位于另一个表中,连接位置集和位置的联结表。

然后Activities会有LocationSetId。而且Attendance会有LocationId。您可能希望在任何给定时间强制执行该Attendance位置与Activity LocationSets中的位置一致。这可以在应用程序层,通过数据库中的触发器,或通过诸如基于函数的约束之类的机制(如果您的数据库支持这些)来完成。