【问题标题】:What is best schema design for Base Information?什么是基本信息的最佳模式设计?
【发布时间】:2018-04-03 19:19:26
【问题描述】:

我们的应用程序中至少有 50 个包含相同属性的对象(例如:citycountrycolorpersonelTypeorganizationType 等等...)。这些属性包含:IDTopicCodeisActive

  • 对于这些包含相同属性的对象,我们创建了两个对象,称为BaseInfoBaseHeader
  • 对于这些对象的设计表,我们创建了一个名为Base-Header 的表和另一个名为Base-Info 的表。这些表的关系是:https://pasteboard.co/GQeV4Rl.png

现在,如果需要,开发人员会在 Base-Header 中添加新记录。例如,开发人员看到Base-Header,如果表中没有city 的记录,则为城市对象添加一条记录:insert into Base-Header (id, topic) values (1, 'city'); 或颜色:insert into Base-Header (id, topic) values (2, 'color');。在此之后,所有开发人员都知道城市记录中headerId 字段的值为Base-Info1,并且可以在应用程序中硬编码此ID 以获取城市数据。在我们的应用程序中具有相同状态的其他对象。

有了这个计划,我们就不需要为citycolor等创建具有相同属性的表和对象。其他需要城市记录的表的所有外键,附Base-Info表。这种表格和对象的设计是否正确?

非常感谢...

【问题讨论】:

  • 您能分享一下您当前的架构和要求吗?因为目前我无法理解您的问题。
  • 嗯,这听起来确实令人困惑和复杂,基于此,我会说对于我不确定我能不能看到的问题,这不是一个很好的解决方案。
  • @kayaman 这个模式设计并且我们使用它我们需要了解这种方法是否正确或者我们需要为每个对象创建表?
  • 根据给出的信息,这似乎是一个糟糕的主意。为数据库中的每种类型的事物创建单独的表。从表面上看,您所描述的内容似乎非常简单和典型,但您有可能使用非常非典型的解决方案使事情变得过于复杂。

标签: java database hibernate oop database-design


【解决方案1】:

听起来您在这里尝试采用EAV 类型的方法。它不适合 RDBMS。不是设计方面的,不是性能方面的,也不是可用性方面的。

如果BaseHeader 的唯一目的是给实体一个类型,那么它就没有必要了。正如 Lawakush 指出的那样,您也可以使用 enum 字段(如果数据库支持它,否则您可以模拟它)而不是单独的表。

如果您选择 EAV 型号,您已收到警告。可以为“任何东西”建模似乎很棒,但最终可能会产生大量无法维护的垃圾,由于数据库中缺乏适当的保护措施而导致数据损坏:外键在EAV 模型。

【讨论】:

  • 我们不使用 EAV 模型,我们有任何实体的专有表,但我们使用 LOV 中的顶级模型(有问题的评论)。像组合、保管箱或其他的 LOV。
  • 我们没有任何扩展,如用于创建表运行时的表单生成器,我们在开发时使用此设计,用于具有相同属性的地图对象。
【解决方案2】:

我没有得到你的实际问题。但我可以建议您为上述问题设计数据库。看到你可以枚举你的对象列表(城市、国家、颜色、pesonnelType 等),如果它们不经常变化,否则你可以将所有上述对象与 id 一起存储在单个表中。并在 base-info 表中添加一列以存储相应对象的 id。所以你最新的基本信息表将有一个额外的列object-id。我想你的问题会这样解决的。。

【讨论】:

  • 感谢重播。根据您的方法,我们必须删除 Base-Header 表并为对象列表添加 Enum 类。这很好,但我的问题是,其他表的所有外键都附有Base-Info 表。这种方式正确吗?或者我们必须为每个对象创建一个表(例如:cityTable 映射到city 对象)?
【解决方案3】:

您首先需要至少 3-6 个月的时间来分析业务需求。一旦一切就绪,它将变得很方便。正如我在您的声明中注意到的那样,业务分析师似乎没有对其进行审查。您需要从 BA 的角度参考这一点,因此一旦编译和总结,它就会在数据仓库的技术角度变得清晰。

【讨论】:

  • 这种方法设计用于数据库分析,只是我们需要了解这种方法是正确的解决方案还是我们需要为每个对象创建表?笔记。这些对象具有相同的属性。在我们的方法中,我们将所有对象映射到一张表中。
  • 由此看来,是的,这种方法是正确的。这与执行查找功能相同。您可能还需要添加一个列标志,以便在目标表和源表中比较是否“I”已插入、“U”已更新、“已删除”(用于历史记录)。
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多