【发布时间】:2014-01-20 14:02:20
【问题描述】:
我正在开发一个小型比萨配送网站,但遇到了 MySQL 表的一个小问题。
我在 Stackoverflow 上找到了这个:https://stackoverflow.com/a/10322293/80907
它提到了以下内容:
- 两个表都必须使用 INNODB 引擎。
- “在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。”
第一个不是真正的问题,但第二个规则是我摸不着头脑的地方。
这是一个您可以订购比萨饼的网站,因此我将用户及其订单的所有数据保存在数据库中。
这是我要写的截图:
所以我将有一个“用户”表和一个“订单”表。用户必须与订单具有一对多的关系。简单地说,订单由创建它的用户标识。所以它是一对多的,识别的。
这意味着“Orders”表将有一个外键,例如“Users_id”。
当您必须为 Pizzas 表和 Orders 表之间的多对多关系创建表时,就会出现问题。
这个表,我们称之为“Order_Details”(MySQL Workbench 自动称之为“Orders_has_Pizzas”)必须同时引用“Orders”和“Pizzas”。
现在,由于“Orders”已经在标识关系中引用了 Users 表,因此这是“Orders”主键的一部分。
让我们再次排除这个可能性:
- “在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。”
这意味着您必须引用整个主键。如果我删除“Order_Users_id”键,我会在尝试创建数据库时收到 1005 错误。
我的问题很简单:有没有办法解决这个问题?因为就像现在一样,我在 3 个不同的表中提到了那个用户 ID。
或者,我是否没有正确理解它,是否确实有必要为了不必为该数据查询不同的表而这样做?
编辑:人们似乎不同意我对正在识别的用户和订单之间的关系。
我不知道如何在不知道用户 ID 的情况下识别单个订单。下订单后,必须有人送披萨,这意味着他们需要知道送披萨的地方。该数据位于用户表中。因此,Users_id 是单个订单身份的一部分。
反正我是这么看的。如果我错了,请解释原因。
编辑 2:感谢 a_horse_with_no_name 澄清了数据库中“身份”的概念,我现在看到了我的逻辑错误。信息可以在 cmets 中找到。
【问题讨论】:
-
Users_id不应该是Orders中主键的一部分。 -
@slaks 是对的,KdgDev 如何识别订单?
order id,不是吗?那么只有order id作为PK标识符是必需的。 -
每个订单都有一个唯一标识符(大概是
id),因此user_id不需要是orders表的PK 的一部分。仅当orders.id为每个用户从 1 开始时才需要,例如id=1, user_id=1, id=2, user_id=1, id=1, user_id=2, ... -
关于您上次的编辑:如果
orders.id是 unique 则足以识别订单。该特定订单应交付给的用户是订单的属性,而不是识别键。您只想在orders_has_pizza表中引用orders.id这一事实证明orders.id在您的系统中是独一无二的。 -
是的。主键用于唯一地识别表中的一行
标签: mysql database foreign-key-relationship composite-primary-key