Mysql RDBMS,外键合并表还是单独表?

Mysql RDBMS,外键合并表还是单独表?,mysql,database-design,Mysql,Database Design,我有一张ai_订单表格 CREATE TABLE `ai_order`( `id` INT(11) NOT NULL AUTO_INCREMENT, `product_id` INT(11) NOT NULL, `quantity` INT(11) NOT NULL, `number` VARCHAR(20) NOT NULL, `addDate` DATETIME NOT NULL, PRIMARY KEY (`id`), UNIQUE

我有一张
ai_订单
表格

CREATE TABLE `ai_order`(
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `product_id` INT(11) NOT NULL,
    `quantity` INT(11) NOT NULL,
    `number` VARCHAR(20) NOT NULL,
    `addDate` DATETIME NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `orderProduct`(`product_id`,`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
由于来自客户的订单包含多个具有数量的产品,这意味着为单个订单插入多行,例如,订单包含50个产品,导致在
ai_order
表中创建50行。现在,为了识别单个订单,我给出了一个数字字段,该字段将保存单个订单的唯一订单号(序列号),即它将根据
数字
字段对
订单id
进行分组。下表演示了如何将数据存储在表中

将有许多表从父表扩展而来。虽然一切都是正确的,但我看到的问题是
number
列一次又一次地重复值,考虑到我有
200
产品要为一个订单列出,我将不得不在所有
200
行中一次又一次地重复
number
列值,这让我有点难看

现在解决这一危机的方法是将订单
编号
存储在另一个表中(虽然重复无法避免,但这不是问题)。例如,如何从
ai_order
表中删除
number
列并以这种方式存储

CREATE TABLE `ai_order_number`(
    `order_id` INT(11) NOT NULL,
    `number` VARCHAR(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我想知道你对如何处理这种方法的看法?你会选哪一个。第一个还是后一个?如有任何改进建议,将不胜感激


谢谢。

我会选择第一种方法,因为在该表中重复订单号没有任何问题,因此无需创建第二个表来重复订单号


相反,我要做的可能是去掉
id
列,并使
number
成为表的主键,因为您更可能根据订单号而不是
id
列执行搜索、联接等操作。
number
列也可以自动生成,这样就不会有问题了。

我认为按照您的建议保留一个单独的表不是一个好主意,因为订单号与订单直接相关

如果您仍计划保留不同的表,请将“
add_date
”与数字一起记录。我发现“
add\u date
”比订单号更难看


如果添加订单的确切时间没有用,通常情况下,您可以保留一个单独的表,其中包含
客户id
订单号
(主键),
订单日期

,我将坚持您的第一个选项。对我来说,这似乎是正确的标准化,在另一个示例中,您必须维护第二个表,这似乎是过度杀戮。还有一个问题,数字字段是另一个orders表的外键吗?这就是我实现它的方式,表ai_order只是产品和订单之间的一个多对多表。number是要提供给客户的参考号,进一步扩展它用于将所有行分组,
ai_订单
是父表,由两个子表组成
ai_订单发票
保存定价详细信息的报价,以及
ai_订单包装
保存通过货物发送的装运和包装相关信息。客户-->订单-->行项目;看这一个数字列似乎是orders表的外键,因此您的计划似乎有缺陷。如果OP允许用户将同一产品添加两次到一个目录中,您将无法将其作为灵魂主键,您将不得不使用类似(编号、产品id)甚至(编号、产品id、添加日期)的内容order@astander不,一个订单只允许一个产品@伊卡洛斯你的建议在逻辑上是不正确的。由于我有许多其他表将与此父表相关,因此我需要一个
id
列来标识属于单个订单和编号字段的每一行,以便将它们组合在一起。Productid、number已经是唯一的。请看表定义。然而,你的观点是正确的;我刚刚又读了一遍这个问题,id显然是fk。我的观点是,id似乎没有必要:他将ordernumber定义为varchar,但它似乎只存储数字,并且是一个序列号,或者看起来是这样。订单号应该足以链接所有表,而不使用这个额外的id列,它似乎没有什么用处。@Ibrahimazharmar是的,我同意,您不能在这个阶段删除id列,但我不清楚这个列从一开始的用途,我的意思是,订单号应该足以链接所有表;此外,似乎只存储整数,因此,为什么要将其定义为varchar?存储整数只是一个例子。数字由连字符(-)、字符和整数组成,这就是varchar的原因。应用程序的结构是,首先从客户处接收订单,并在订单表中维护记录,该表不包括任何定价详细信息。收到订单后,报价分为两个阶段,首先是报价(初始发票),然后是最终发票。现在我必须为每个订单id报价,因此我需要
id
列,我需要生成一个唯一的编号,以供客户参考,这就是编号的原因。