一对一关系还是一对多关系?

时间:2010-08-16 15:01:05

标签: sql mysql sql-server database database-design

也许我今天早上需要更多咖啡,但这里有......

我有一个非常简单的库存系统。现在我有两个表:项目和库存。


标识
标题
年发布

广告
标识
ItemId(项目的外键)
数量
QuantityOnHand

每个项目都有一个库存,每个库存属于一个项目。两者之间的关系是一对一的。但是,当我想出这个时,基于我的设置到目前为止的关系是一对多的,因为我对库存的自动递增ID。

现在,我可以通过消除Inventory表中的自动递增ID来实现这一对比,但这让我觉得很脏。我总是使用内部id作为主键。

我看到了几个选项:

1。)删除库存中的自动递增ID字段,并感受到肮脏的感觉 2.)按原样保留表格 3.)将项目和库存合并到一个表中:ItemsInventory 4.)别的什么?

7 个答案:

答案 0 :(得分:7)

如果您的关系确实是一对一的,请从Inventory表中删除Id,并将ItemId用作PK和FK。另外,将两个键命名为ItemId - 帮助。

inventory_model

答案 1 :(得分:1)

由于许多ORM需要单个自动增量PK,我会:

4)为Inventory.ItemId添加一个唯一索引,它应该显示为一对一的关系。

答案 2 :(得分:1)

如果您确定映射将始终为1:1,则将两个表合并为一个。

但是,你确定这种关系总是1:1?

答案 3 :(得分:0)

使ItemId有一个唯一的约束不足吗?这似乎满足了你的要求。

答案 4 :(得分:0)

如果您提到的表结构将保持现状,那么我认为您应该将Items和Inventory合并到一个表中:ItemsInventory。

对于这样的小表,将它们垂直分区是没有意义的。这样你就可以删除额外的连接。在单个表上选择总是比连接更快。

答案 5 :(得分:0)

我将这两个表合并在一起我的主要原因是你将有重复数据 如果你坚持使用两个表,那么以及不必要的数据。查询也会更快!看看这两张桌子,我肯定会合并为一张。

产品 ID 标题 年发布

库存 ID ItemId(项目的外键) 数量 QuantityOnHand

如果合并到一个表中,你将有两个较少的数据充满数据(“ID”ItemID“可以被删除)。编写逻辑以检索并将数据发送到数据库也将更容易。

我会有这张桌子:

**ItemsInventory**
Id
Title
YearReleased 
Quantity
QuantityOnHand 

但是你必须确定它是一对一的,否则如果商业需要改变,你可能会给自己做很多工作。

西蒙

答案 6 :(得分:0)

如果你真的想让它成为一个简单的库存系统,那么合并表格。

不合并表的原因/它并不简单。

有多少物品没有库存记录?您的示例仅显示一些库存字段,也许这就是它可能拥有的所有内容。但是,您在库存中跟踪的字段会增长,而且大部分商品都不在库存中,您将拥有大量的空字段。

广告资源多久更新一次?如果这些字段是经常更新其他交易表(购买和销售)的结果,则没有理由仅仅因为购买或出售库存而不断更新项目表。在您当前的系统中,用户希望这些值是实时的(如果不是,那么他们就知道什么是最新的,因为他们没有进行更改。)。