【问题标题】:Database Is-a relationship数据库是一种关系
【发布时间】:2012-12-05 09:09:55
【问题描述】:

我的问题与数据库模式开发有关,如下所示。

我正在开发一个购买模块,我想在其中购买物品和服务。 以下是我的 EER 图,(请注意,服务的专门属性很少——最多 2 个)

我的问题是将产品和服务放在两张表中还是只放在一张表中?

一个表选项 - 降低复杂性,因为我只需要指定 item id 引用 item 表,该表将具有“item_type”字段来识别它是产品还是服务

两个表选项 - 在我想引用它们的任何地方都必须引用单独的产品或服务,并且必须在每个引用产品或服务的表中保留“item_type”字段?

目前计划使用选项 1,但想了解专家对此问题的意见。非常感谢您的时间和建议。谢谢。

【问题讨论】:

    标签: database database-design schema database-schema entity-relationship


    【解决方案1】:

    我当然会选择“两张桌子”选项。你看,你必须区分产品和服务,所以你可以在你的程序中使用switch(item_type) { ... },或者产品和服务的代码路径完全不同。如果需要更新 DB 架构,switch 就更难维护了。

    第二个原因是 NULL。我建议尽可能避免使用它们——它们产生的问题比解决的问题多。使用两个表,您可以将所有字段声明为非 NULL 并忘记 NULL 处理。使用一个表选项,您必须手动编写代码以确保如果item_type=product,则特定于产品的字段不为空,特定于服务的字段不为空,并且如果item_type=service,则特定于服务的字段不为空, 和特定于产品的。这不是一件令人愉快的工作,DBMS 无法为您完成(SQL 中没有 NOT NULL IF another_field = value 列约束或类似的东西)。

    去两张桌子。更容易支持。我曾经看到一个数据库,其中所有内容,每条数据都只放在两个表中——有几页又几页的代码来确保必要的字段不为 NULL。

    【讨论】:

    • 感谢您对编码视角和 null 问题的见解。干杯
    【解决方案2】:

    如果我要实现,我会选择两个表选项,这有点像模式规范化的第一条规则。删除多值属性。不推荐使用 item_type。创建单独的表后,您不需要使用 item_type,只需使用外键关系即可。

    考虑阅读这篇文章: http://en.wikipedia.org/wiki/Database_normalization

    应该有帮助。

    【讨论】:

    • 感谢@Aakif 是的,表一选项似乎根本错误。感谢您的指导。干杯。
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多