怀疑数据库设计

时间:2010-02-15 01:15:56

标签: sql mysql database-design

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

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

典型产品表:

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

但我还需要公司产品中的更多细节,例如:

INT instock  
DATETIME laststockupdate  
...

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

1 -
将公司和第三方产品都放在一张桌子上,
某些列不会被第三方产品使用
确定公司产品是由供应商ID识别的

2 -
将公司产品和第三方分开放在表格中

3 - [新,谢谢RibaldEddie]
有一个产品表,
公司产品在单独的表格中有其他信息

提前致谢!

6 个答案:

答案 0 :(得分:2)

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

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

Oooo跟3一起去! 3是最好的!

答案 1 :(得分:1)

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

  1. 预计会有多少数据(影响查询速度)
  2. 可扩展性在不久的将来会成为一个问题(我想在5年之内)
  3. 如果您确实为所有库存使用单个表格,那么稍后您决定拆分它们,您可以。您建议某种供应商标识符。在表格(包括您的公司)中列出供应商,其中包含您的库存密钥。那真的没关系。

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

答案 2 :(得分:1)

我同意RibaldEddie。只需添加一件事:在InHouseProductDetails表中对该外键设置唯一约束。这将强制它是两个表之间的一对一关系,因此您不会意外地为一个产品最终得到两个InHouseProductDetails记录(可能来自某些dataload出错或者什么)

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

答案 3 :(得分:0)

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

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

请注意,无论如何您都需要Stock表格,这只会使数据库模型更加与公司无关 - 所以如果您需要存储有关第三方产品的库存水平信息,则无需更改数据库

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

如果您对单元测试能够解决这个问题感到高​​兴,那就不用担心......如果您依赖于人工测试人员,那么在调整变更影响时就会出现问题。 / p>

就个人而言,我会选择一个产品表,其中包含第三方和第三方的共同细节和单独表格。公司细节。