数据库设计 - 管理这些关系的最佳方式
Posted
技术标签:
【中文标题】数据库设计 - 管理这些关系的最佳方式【英文标题】:Database Design - Best way to manage these relationships 【发布时间】:2011-07-22 08:49:56 【问题描述】:我正在开展一个项目(基于 Django,尽管这与我的问题并不真正相关),并且我正在努力找出表示数据模型的最佳方式。
我有以下四种型号:
用户, 客户, 会议, 位置
用户和客户通过会议模型建立了多对多的关系。 Meeting 模型与 Location 模型具有一对一的关系。
会议将在以下任一地点举行:
-
在用户(或用户配置文件)模型中定义的地址
客户端模型中定义的地址。
必须在以后定义的其他位置。
我正在努力寻找存储位置数据的最佳方式,以使其尽可能干净和可重复使用。
我考虑将位置设置为会议模型中的一个字段,而不是一个单独的模型 - 尽管如果在同一位置创建大量会议,这也可能导致冗余数据,所以这可能是一个非首发。
我可以为每个创建的用户和客户端自动创建位置记录,并在相关记录之间使用通用关系,但是,我知道这会导致数据库性能低下。此外,并非每个客户/用户都能够在他们的位置举行会议。
谁能看到更整洁的替代方案?
任何建议表示赞赏。
谢谢。
【问题讨论】:
【参考方案1】:我考虑将位置设置为会议模型中的一个字段,而不是 而不是一个模型本身——尽管这也可能导致 如果在同一位置创建大量会议,则会出现冗余数据, 所以这可能不是首发。
不,这是一个真的好主意,因为它直接指出了真正的问题。
真正的问题在于,会议与参加会议的各方之间存在差异。会议有一些与与会者无关的属性:它至少有时间和地点。
所以我认为你应该改变你对会议模式的看法。
用户不应通过会议模型与客户建立 M:N 关系,而应通过例如出勤模型建立 M:N 关系。 (注册或预订或 MightAttend 模型可能更适合您。)会议模型应更改以反映现实世界会议的独特属性:时间和地点。
【讨论】:
【参考方案2】:我希望会议和地点具有多对一的关系。一个位置不能用于多个会议吗? (当然是在不同的时间)
在我看来,一个位置的属性在其用于单个会议之外仍然存在。例如:座位容量。
【讨论】:
以上是关于数据库设计 - 管理这些关系的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
RESTful API 设计更新 1/多对多关系的最佳实践?