数据库设计 - 管理这些关系的最佳方式

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/多对多关系的最佳实践?

设计自动化数据库的最佳解决方案? [复制]

打破业务逻辑和数据层似乎重叠的最佳设计? [关闭]

针对这种特殊需求的最佳数据库和数据库设计

Elasticsearch最佳实践之Index与Shard设计

Elasticsearch最佳实践之Index与Shard设计