【问题标题】:Doubt regarding a database design对数据库设计的怀疑
【发布时间】:2010-02-16 00:50:59
【问题描述】:

我对数据库设计有疑问,假设是金融/股票软件

在软件中,用户将能够创建订单, 这些订单可能包含公司产品或第三方产品

典型产品表:

PRIMARY KEY INT productId  
KEY INT productcatId
KEY INT supplierId
VARCHAR(20) name
TEXT description
...

但我还需要公司产品的更多详细信息,例如:

INT instock  
DATETIME laststockupdate  
...

问题是,我应该如何存储数据? 我正在考虑两种选择:

1 -
将公司和第三方的产品放在一个表中,
某些列不会被第三方产品使用
标识公司产品由供应商标识标识

2 -
将公司产品和第三方放在单独的表格中

3 - [新,感谢 RibaldEddie]
拥有单品表,
公司产品在单独的表格中有附加信息

提前致谢!

【问题讨论】:

    标签: sql mysql database-design


    【解决方案1】:

    您没有提到需要存储单独的供应商信息位,只是一种产品具有额外信息。因此,您可以拥有一个 products 表和一个 InHouseProductDetails 表,该表有一个 productId 外键返回到存储公司特定信息的 products 表。然后,当您运行查询时,您可以将 products 表连接到 details 表。

    好处是您不必在 products 表中有 NULLable 列,因此您的数据更安全,不会损坏,您不必将产品本身存储在两个单独的表中。

    哦,选择 3! 3是最好的!

    【讨论】:

    • 太棒了!我可以通过它的供应商标识来识别公司产品,并使用额外的库存信息来操作表格。问题:空数据会损害我的数据库吗?
    • “你的数据库总是会伤害你的空数据。如何处理空数据显示了通往真正幸福的道路”
    • 是的,空数据会损害您的数据库:databasedesign-resource.com/null-values-in-a-database.html 但是,我经常发现自己创建的表允许列中包含空值。有时,为了每个人的利益,通过不精确来保持简单比争论需要多少精确度和正确性来解决特定的小问题更有价值。
    • 很好的答案,虽然我想我可能会扩大一个碎片。 Ribald 通过遵守规范化规则得出他的答案。 en.wikipedia.org/wiki/Database_normalization 在我看来,数据库设计中的 3NF 通常会导致数据库设计既可用又设计良好。高阶表格只是变得毛茸茸的。另请参阅:papers.ssrn.com/sol3/papers.cfm?abstract_id=905060,了解为什么规范化可能不是数据库设计的终极目标
    【解决方案2】:

    说实话,我认为#1 或#2 的选择完全取决于其他一些因素(我目前只能选择 2):

    1. 预计有多少数据(影响查询速度)
    2. 在不久的将来,可扩展性是否会成为一个问题(我猜在 5 年内)

    如果您确实为所有库存使用了一个表,然后决定拆分它们,您可以。您建议了某种供应商标识符。在表格中列出供应商(包括您的公司)以及您的库存键。那么就真的无所谓了。

    就 UNION 而言,自从我编写原始 Sql 以来已经有一段时间了 - 所以我不确定 UNION 是否是正确的语法。但是,我知道您可以从多个表中提取数据。其实刚发现这个:Retrieving Data from Multiple Tables with Sql Joins

    【讨论】:

    • 我不希望有太多数据,所以我更喜欢让我的生活更轻松的东西 ^^ 关于 UNION,我刚刚测试过,它有效:SELECT name FROM t_items WHERE instock > 0 UNION SELECT名称来自 t_suplieritems
    • 优秀...我想我需要摆脱我的 Sql 文本的灰尘... ;)
    【解决方案3】:

    我同意 RibaldEddie 的观点。只需添加一件事:在 InHouseProductDetails 表中对该外键设置唯一约束。这将强制它是两个表之间的一对一关系,因此您不会意外地为一个产品获得两个 InHouseProductDetails 记录(可能是由于某些数据加载出错或其他原因)

    约束就像防御性驾驶;它们有助于防止意外...

    【讨论】:

      【解决方案4】:

      我建议使用第 1 点。当另一个供应商出现时会发生什么?在一个产品表/产品类上扩展也更容易。

      【讨论】:

        【解决方案5】:

        还要考虑您的应用程序的测试。将所有数据放在一个表中可能需要测试应用程序的第 3 方和公司元素以进行任何更改。

        如果您很高兴您的单元测试可以解决这个问题,那就不用担心了...如果您依赖人工测试人员,那么在确定更改的影响时它会成为一个更大的问题。

        就我个人而言,我会选择一个包含常见细节的产品表,以及用于第三方和公司细节的单独表格。

        【讨论】:

          【解决方案6】:

          一个表,用于具有 Vendor 表的外键的产品;在 Vendor 表中包含您自己的公司

          Stock 表可用于存储任何产品的库存水平信息,而不仅仅是您的产品

          请注意,无论如何您都需要 Stock 表,这只会使 DB 模型更加与公司无关 - 因此,如果您需要存储有关第三方产品的库存级别信息,则无需更改 DB

          【讨论】:

          • 我是这么想的,但是如何跟踪公司产品库存呢?
          • 该问题不包括存储有关供应商信息的任何要求,只是某些产品具有额外信息。不要在不需要的地方添加域实体!
          • @[RibaldEddie]:有趣的观点 - 那么您认为 SupplierId 是什么意思?
          • @[arthurprs]:与任何其他产品库存一样 - 贵公司生产该商品而不是 X 公司这一事实对数据库来说并不重要...
          • @[arthurprs]:除非您不需要跟踪第三方产品的库存(这似乎...奇怪;所有东西都是直接发货的吗?您如何处理缺货订单?) .无论如何,第二个库存表就足够了,只要其中可能没有任何第三方产品条目。但无论供应商是谁,产品仍然是产品......
          猜你喜欢
          • 2017-10-01
          • 2012-09-19
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-02
          • 2019-04-14
          相关资源
          最近更新 更多