【问题标题】:database table design question数据库表设计题
【发布时间】:2010-12-18 23:38:06
【问题描述】:

我有三个表(定义如下)。我的问题是每个“foo”行可以有多个“bar”行。所以我需要一个“fooToBar”表。这是正确的设计吗?这种情况的名称或设计模式是什么?表有比“fooToBar”表更好的名称吗?非常感谢。


fooID
姓名

条形
条码
姓名

fooToBar
fooID
条码

【问题讨论】:

  • 如果每个 foo 行只有多个 bar 行,则将 foo 表中的外键放入 bar 表中。您需要 foo 和 bar 之间的交集表的唯一原因是这些表是否具有多对多关系。

标签: sql database database-design


【解决方案1】:

您命名的设计是针对 n:m 关系的。如果 foo 和 bar 彼此独立,并且每个 foo 可以与多个 bar 相关 - 而且每个 bar 可以与多个 foo 相关,那么这就是要走的方法。

如果每个 bar 只能与一个 foo 相关联,则您处于 1:n 关系中,只需将 fooID 列添加到 bar 表即可。

我会说,如果您在整个数据库中保持命名约定,那么这个名称就没有问题(但更正大写)。

【讨论】:

  • 应该如何大写?
  • 只是一致的。你有 foo, bar, fooToBar - 看到这个,你可能会争辩从小写开始,然后是驼峰式,但我的第一个认识是你的名字中有“bar”和“Bar”。这是个人品味 - 我会保持一致,但您不妨始终如一地使用这种技术(当我回答时,我真的没有看到您大写的原则)。
【解决方案2】:

如果单个 foo 可以有多个 bars,但反过来不行,那么您就有了所谓的 one-to-many relationship strong> 在 foobar 之间。要对这种关系建模,您可以在 bar 中添加一个名为 fooId 的列。不需要 fooToBar 表。

但是,如果单个 foo 可以同时有多个 bars 单个 foos 可以同时存在多个 foos bar 那么您在 foobar 之间有一个 many-to-many relationship,这需要第三个连接表 (fooToBar) .

关于命名约定,我通常使用适当的大小写(不是驼峰大小写),并为每个数据库对象附加一个前缀,该前缀标识该对象所属的应用程序。此外,我通常命名我的多对多连接表,以便它们包含其他两个表的名称。例如,如果我正在构建 Stackoverflow,我可能会在每个数据库对象前面加上 so,这意味着我在多对多示例中的表将被命名为:

  • so_Foo
  • so_Bar
  • so_FoosBars

我认为比命名细节更重要的是你选择一个约定并坚持下去。

编程愉快!

【讨论】:

    【解决方案3】:

    如果 foo bar 关系是可选的,则需要 FooToBar 表,即,如果您想允许 Bar 行没有对应的 Foo 行。否则,您可以将 foo 属性作为外键放在 bar 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多