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

关于数据库设计的疑问

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

    我对数据库设计有疑问,假设一个财务/股票软件

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

    典型产品表:

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

    但我也需要公司产品的更多细节,比如:

    INT instock  
    DATETIME laststockupdate  
    ...
    

    问题是,我应该如何存储数据? 我有两种选择:

    1
    将公司和第三方产品放在同一个表中,
    某些列不会被第三方产品使用
    通过供应商ID识别公司产品

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

    3 [新的,谢谢Ribaleddie]
    有一个产品表,
    公司产品在单独的表中有附加信息

    事先谢谢!

    6 回复  |  直到 15 年前
        1
  •  2
  •   RibaldEddie    15 年前

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

    这样做的好处是,在products表中不必有可为空的列,因此您的数据更安全,不必将产品本身存储在两个单独的表中。

    哦,跟3一起走!3是最好的!

        2
  •  1
  •   IAbstract    15 年前

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

    1. 预期的数据量(影响查询速度)
    2. 在不久的将来,可扩展性是否会成为人们关注的问题(我猜在5年之内)

    如果您确实为所有库存使用一个表,那么稍后决定拆分它们,您可以。您建议了某种类型的供应商标识符。在表格中列出供应商(包括贵公司),并提供库存的键。那就没关系了。

    至于union,我已经有一段时间没有编写原始SQL了——所以我不确定union是否是正确的语法。但是,我知道您可以从多个表中提取数据。其实刚刚发现了: Retrieving Data from Multiple Tables with Sql Joins

        3
  •  1
  •   Evan    14 年前

    我同意里鲍德迪的观点。只需添加一件事:在inhouseProductDetails表中对该外键施加唯一约束。这将加强两个表之间的一对一关系,因此您不会意外地以一个产品的两个内部产品详细信息记录(可能来自某个数据加载出错或其他原因)结束。

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

        4
  •  0
  •   Saif Khan    15 年前

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

        5
  •  0
  •   MadMurf    15 年前

    还要考虑应用程序的测试。将所有数据都放在一个表中,可能会要求测试应用程序的第三方和公司元素,以便对两者进行任何更改。

    如果你很高兴你的单元测试能解决这个问题,那就不用担心了…如果您依赖于一个人类测试人员,那么在评估变更的影响时,它将成为一个更大的问题。

    就我个人而言,我会选择一个产品表,其中包含常见的详细信息,以及针对第三方和公司详细信息的单独表。

        6
  •  0
  •   Steven A. Lowe    14 年前

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

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

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