我对数据库设计有疑问,假设有一个财务/股票软件
在软件中,用户将能够创建订单, 这些订单可能包含公司产品或第三方产品
典型产品表:
PRIMARY KEY INT productId
KEY INT productcatId
KEY INT supplierId
VARCHAR(20) name
TEXT description
...
但我还需要公司产品中的更多细节,例如:
INT instock
DATETIME laststockupdate
...
问题是,我应该如何存储数据? 我在考虑两个选项:
1 -
将公司和第三方产品都放在一张桌子上,
某些列不会被第三方产品使用
确定公司产品是由供应商ID识别的
2 -
将公司产品和第三方分开放在表格中
3 - [新,谢谢RibaldEddie]
有一个产品表,
公司产品在单独的表格中有其他信息
提前致谢!
答案 0 :(得分:2)
您没有提及需要存储单独的供应商信息,只是某类产品有额外信息。因此,您可以拥有一个产品表和一个InHouseProductDetails表,该表将productId外键返回到存储公司特定信息的products表。然后,当您运行查询时,可以将products表连接到详细信息表。
好处是您不必在products表中拥有NULLable列,因此您的数据更容易损坏,并且您不必将产品本身存储在两个单独的表中。
Oooo跟3一起去! 3是最好的!
答案 1 :(得分:1)
说实话,我认为#1或#2的选择完全取决于其他一些因素(目前我只能做2件事):
如果您确实为所有库存使用单个表格,那么稍后您决定拆分它们,您可以。您建议某种供应商标识符。在表格(包括您的公司)中列出供应商,其中包含您的库存密钥。那真的没关系。
就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>
就个人而言,我会选择一个产品表,其中包含第三方和第三方的共同细节和单独表格。公司细节。