数据库:什么设计指向两种可能性?
Database : what design to point on two possibilities?
我正在为一个新项目设计数据模型。
其中一项要求指定某些对象可以指向个人或公司。
实现该目标的最明智方法是什么?
我想过这样的tablelink"actor"(用优秀的yUML.me BTW画的):
在actor
table中,根据actor_type
,person_id
或company_id
是其对应的外键table或是 NULL
。这样,当 one_table
想要检索有关 actor
的详细信息时,我首先检查 actor_type
字段并检索 person_id
或 company_id
.
它正在工作,但我正在寻找更好的设计。
Here is the link for editing the diagram
很难给出真正的答案,但我有一些笔记可能对你有用。
但它们真的只是一些笔记。
总体而言,鉴于已知的情况,此数据模型似乎不错。
- 演员类型不一定是另一个 table。例如,它可能只是此 table 上的编码值。
- 如其他评论所述,如果 actor 只能指向两件事,则 actor 类型 table 在技术上不是必需的 - 但我可能仍会使用它,因为它更易于维护且更多code/sql/database 的未来维护者可以长期阅读。即,指示类型的字段的存在增加了 code/sql 和模型的人类可读性,即使机器不需要它也是如此。
- 考虑到数据库的演进,有一点需要考虑,你认为它永远只是person/company还是将来可能会有不同的类型。如果将来可能是其他参与者类型,现在值得考虑将 actor_type 和 id 分解为 link table 是否有助于限制模式的演变为此 table。
我建议你创建引用相同超类型(演员)的公司和个人子类型。请注意,您不需要单独的 person_id、company_id,因为演员必须是其中之一,不能同时是两者。像这样:
这是 classes/subclasses 的经典案例(或者,如果您更喜欢 types/subtypes)。我建议您访问以下三个标签并查看已标记的问题以及您可以在 "learn more".
下看到的标签 wiki
single-table-inheritance
class-table-inheritance
shared-primary-key
这可能会给您所有需要的答案。或者您可能更愿意将这些标签中的一个或多个添加到您的问题中,以吸引更多的答案。
注意:在标签中使用 "inheritance" 一词的原因是这些技术允许您获得一些内置于实现继承的对象环境中的好处。
我正在为一个新项目设计数据模型。
其中一项要求指定某些对象可以指向个人或公司。
实现该目标的最明智方法是什么?
我想过这样的tablelink"actor"(用优秀的yUML.me BTW画的):
在actor
table中,根据actor_type
,person_id
或company_id
是其对应的外键table或是 NULL
。这样,当 one_table
想要检索有关 actor
的详细信息时,我首先检查 actor_type
字段并检索 person_id
或 company_id
.
它正在工作,但我正在寻找更好的设计。 Here is the link for editing the diagram
很难给出真正的答案,但我有一些笔记可能对你有用。
但它们真的只是一些笔记。
总体而言,鉴于已知的情况,此数据模型似乎不错。
- 演员类型不一定是另一个 table。例如,它可能只是此 table 上的编码值。
- 如其他评论所述,如果 actor 只能指向两件事,则 actor 类型 table 在技术上不是必需的 - 但我可能仍会使用它,因为它更易于维护且更多code/sql/database 的未来维护者可以长期阅读。即,指示类型的字段的存在增加了 code/sql 和模型的人类可读性,即使机器不需要它也是如此。
- 考虑到数据库的演进,有一点需要考虑,你认为它永远只是person/company还是将来可能会有不同的类型。如果将来可能是其他参与者类型,现在值得考虑将 actor_type 和 id 分解为 link table 是否有助于限制模式的演变为此 table。
我建议你创建引用相同超类型(演员)的公司和个人子类型。请注意,您不需要单独的 person_id、company_id,因为演员必须是其中之一,不能同时是两者。像这样:
这是 classes/subclasses 的经典案例(或者,如果您更喜欢 types/subtypes)。我建议您访问以下三个标签并查看已标记的问题以及您可以在 "learn more".
下看到的标签 wikisingle-table-inheritance class-table-inheritance shared-primary-key
这可能会给您所有需要的答案。或者您可能更愿意将这些标签中的一个或多个添加到您的问题中,以吸引更多的答案。
注意:在标签中使用 "inheritance" 一词的原因是这些技术允许您获得一些内置于实现继承的对象环境中的好处。