这是一个示例模式,用于说明我在谈论的内容:
让我们说我存储有关某些活动(研讨会,培训,等等)的信息,这些活动在某些地点(由黑客,游泳池等)和城市确定。每个活动都发生在合适类型的所有位置一次(例如,任何编程研讨会一次发生在所有黑客空间),因此任何人都可以选择参加任何合适的活动位置。因此,任何活动仅与某些位置类型相关联,而出勤记录与某些活动相关联(因此与某些位置类型隐含关联)以及此特定用户参与活动的城市。
到目前为止,系统中最常见的查询是生成一个由给定人员参加的所有活动的报告。
我觉得这很难看吗?我应该尝试重新设计这个,如果是的话,怎么样?
P.S。我宁愿不透露存储在数据库中的实际数据,我必须采用类似的设计,所以我希望这个比喻有道理。
答案 0 :(得分:1)
听起来您需要一个包含位置类型列表的LocationTypes
表。然后,Location
可以与LocationTypes
建立外键关系。
但是,我不想假设这些地点不会随着时间的推移而改变。所以这过于简单化了。所以,我会有另一个像LocationSets
这样的实体,它会列出给定活动随时间的位置。 LocationSets
将包含"类型"可以使用。与位置集关联的位置将位于另一个表中,连接位置集和位置的联结表。
然后Activities
会有LocationSetId
。而且Attendance
会有LocationId
。您可能希望在任何给定时间强制执行该Attendance
位置与Activity
LocationSets
中的位置一致。这可以在应用程序层,通过数据库中的触发器,或通过诸如基于函数的约束之类的机制(如果您的数据库支持这些)来完成。