【问题标题】:is it possible to not give a primary key to an association table?是否可以不给关联表提供主键?
【发布时间】:2021-09-19 07:30:46
【问题描述】:

您好,我正在使用 phpmyadmin 创建一个数据库来控制从companyA 到其他公司的订单。我创建了两种公司可以订购并且需要区分的对象:

  • 配件(可以是该企业使用InventoryItems的电池,也可以是从其他企业购买的电池)
  • InventoryItems(可以是从其他企业购买的螺钉或钉子)

这就是我在deliver 表中得到的内容

CREATE TABLE `deliver` (
  `AccesoryId` int(36) NOT NULL,
  `ItemId` int(36) NOT NULL,
  `OrderId` int(36) NOT NULL,
  `quantity` int(11) NOT NULL
)

一切看起来都不错,但这是我的问题:

  • 我不能下一个不只包含配件或只包含物品的订单。它们不能为 NULL,因为它们是主键的一部分 所以我尝试将它们从主键中删除,并且只使用 orderId 但现在:
  • 我无法将不同的商品或配件链接到一个订单。因为它会重复主键

所以我尝试删除复合主键以摆脱这些问题并创建一个可以链接每个表的主键的关系(这将有助于我能够同时将对象链接到订单是时候让我把它们设为 NULL)

现在我的问题是,关联表没有任何主键是不是很糟糕,还是有更好的方法来做到这一点?

【问题讨论】:

  • 你应该张贴CREATE表格的声明而不是图片。
  • any 表没有主键,这非常很糟糕。
  • 我不同意之前的帖子。关联表可以在没有主键的情况下完美运行。虽然关联表的整个 point 是它为新关联创建了一个新行,但您的第二个点无论有没有都可以工作。
  • 附注:与您的命名保持一致。 inventory_item 表有一个 itemid。那么库存是如何发挥作用的呢?听起来肯定存在一些库存表,而inventory_item表是item和inventory之间的关联表。由于不是这种情况,要么命名表inventory_item 和ID inventory_item_id,要么命名表item 和ID item_id。顺便说一句,复合名称是关联的好名称:order_item、order_accessory、item_accessory 是数据库中关联表的好名称。

标签: mysql sql database


【解决方案1】:

表不必有主键。所以通常情况下,交付表没有一个也没关系。但是,它需要什么来保证一致性:

  • 当然是外键约束。
  • 检查约束,在每一行中,accessory_id 和 item_id 中的一个为 null,另一个不为 null。
  • (order_id,accessory_id)上的唯一索引
  • (order_id, item_id) 上的唯一索引

我可能会改用两个交付表:

  • order_item(order_id、item_id、数量)
  • order_accessory(order_id、accessory_id、数量)

那么两者都会有一个主键(因为 item_id 和附件 ID 不为空)并且更容易查询数据。

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 2019-06-07
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2023-01-23
    • 2022-01-18
    相关资源
    最近更新 更多