0

好吧,所以我从某个地方读到

每个表都应该有一个主键

但是我的一些表似乎不正常!我也想知道我正在使用的关系是否很好,或者我需要进一步解散它们,我愿意接受建议。

关系是

经销商(DealerId(PK),DealerName)

订单(DealerId(FK),OrderDate,TotalBill)

销售(DealerId(FK),ItemType,OrderDate,Quantity,Price)

PS 我不能制作一个名为 Items(ItemCode,Type,Price) 的表,因为不同经销商的价格是可变的。并且我需要的所有约束(即非空+检查)都已处理,只是没有提及。

1、关系解得好吗?

2. 我应该关心在还没有的表中设置主键吗?

有用的回应表示赞赏。

4

3 回答 3

0

你真的需要单独的销售表吗?

Dealers(DealerId(PK),DealerName)
Order(OrderId(PK), DealerId(FK),OrderDate, ItemType, Quantity,Price)

还,

TotalBill (can be calculated) = Quantity * Price
于 2013-03-20T13:42:21.550 回答
0

在您的情况下,您应该向 Order 和 Sales 添加一个自动递增整数字段,并将其设置为主键。

在关系数据库理论中,您有时可以识别字段的子集以用作主键,只要这些列不为空且唯一。但是,(1)订单表不能有来自 DealerID 和 OrderDate 的主键,因为经销商可以在同一日期下两个订单。甚至可能是相同的数量,这意味着没有字段的子集是唯一的,并且(2)即使熟悉的数据可以唯一地标识数据,自增整数也可能是一个很好的键。

我还认为您需要从 Sales 到 Order 的外键。您可能正在使用 DealerId 和 OrderDate 进行连接,但如果经销商在同一日期下达两个订单,这将无法正常工作。

最后,接受这样的建议

每个表都应该有一个主键

一粒盐。用于多对多关系的链接表可以在没有主键的情况下完美运行,尽管主键可以是一种改进,因为它可以更轻松地删除记录,并且如果链接表上没有主键,我仍然会推荐所有字段的唯一索引,在这种情况下,它可以是主键。

于 2013-03-20T13:44:07.690 回答
0

关于问题 1,您应该回答这个问题:

没有订单可以进行销售吗?

如果是,那么您在 Sales 中的 DealerId(FK) 没问题,假设只有在经销商完成销售时才会存在销售。

如果不是,您应该在 Sales 中输入 OrderId(FK),而不是 DealerId(FK)。如果销售属于订单,则该订单属于经销商,因此您已经拥有经销商与销售的关系。

关于问题 2,您的表上应该有主键,因为这是您必须选择、更新和删除数据库中某些特定项目的方式。请记住,主键并不总是自动递增列。

关于 Items 表,如果价格对于不同的经销商是可变的,那么经销商和项目之间存在 M 到 N 的关系,这意味着您可以有一个像下面这样的中间表:

DealerItemPrices(DealerId(FK), ItemId(FK), 价格)

并且这两个外键应该是唯一的复合键,这样经销商 Y 就不能对同一项目有两个不同的价格。

希望能帮助到你!

于 2013-03-20T14:21:10.237 回答