代码之家  ›  专栏  ›  技术社区  ›  Mathew

数据库模式-按对象或数据组织?

  •  1
  • Mathew  · 技术社区  · 15 年前

    我正在重构一个可怕的交织在一起的数据库模式,这并不是说它过于规范化了;只是随着时间的推移变得丑陋,而且布局不太好。

    有几个表(论坛板、论坛帖子、创意帖子、博客条目)共享几乎相同的数据结构和组成,但仅仅因为它们从应用程序的角度表示不同的“对象”,所以被分开。我最初的反应是将具有相同数据结构的所有内容放入同一个表中,并在执行选择时使用“类型”列来区分数据。

    我是否会采用这种“一体式”的方法,并允许(可能)应用程序的许多部分访问同一个表,从而让自己陷入困境?仅供参考,我看不到这个数据库在未来一年左右的时间里会增长到超过~20MB…

    3 回复  |  直到 15 年前
        1
  •  0
  •   tex    15 年前

    我以前不喜欢这种“一刀切”的方法,但几年前我被迫在一个复杂的项目中使用它之后,我成了一个粉丝。如果索引表正确,性能应该是正常的。例如,您需要类型列上的索引来加速按类型排序操作。

    我现在通常建议您使用一个表来存储类似的对象。唯一的问题是,您想使用子表来存储特定于某个对象类型的数据吗?这个问题的答案实际上取决于每个对象类型的结构有多不同,以及您将拥有多少个对象类型。如果有50个对象类型的结构差别很大,您可能需要考虑只在主表中存储一致的对象部分,并为每个对象类型创建一个子表。

    不过,在您的示例中,我认为您可以将所有内容放在一张表中。

    有关详细信息,请参阅以下内容: http://www.agiledata.org/essays/mappingObjects.html

        2
  •  1
  •   troelskn    15 年前

    基本上有三种方法可以在关系数据库中存储对象继承层次结构。各有利弊。见:

    The book 也很棒。幸运的是,第3章“映射到关系数据库” is available freely as a sample chapter .你可以在那里了解更多关于权衡的信息。

        3
  •  0
  •   deleted    15 年前

    不要过于依赖“应用程序视角”,它往往会随着时间的推移而变化。通常数据库也会被不同的应用程序访问,而且通常比所有应用程序都长…

    当Simliar对象存储在不同的表中时,原因可能是它们实际上表示相同的域对象,但处于不同的状态,或者在工作流的不同步骤中。然后将它们保存在一个表中并添加一些简单的属性来标记状态通常是有意义的。如果工作流或其内容发生更改,也更容易更改数据库和应用程序,您可能不需要添加更多的表或类。