RDBMS,外键合并或单独表?

时间:2011-09-20 04:31:49

标签: mysql database-design

我有一张ai_order表。

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行。现在要识别一个单独的订单,我已经给出了一个数字字段,该字段将保存单个订单的唯一订单号(序列号),即它将order_id字段分组number。下面是演示如何将数据存储在表格中的表格。

ai_order

将有许多表将从此父表扩展。虽然一切都是正确的,我看到的问题是number列一次又一次地重复该值,考虑到我要将200产品列为一个订单,我将不得不重复number列在所有200行中一次又一次地重视,这给我带来了一些难看的感觉。

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

CREATE TABLE `ai_order_number`(
    `order_id` INT(11) NOT NULL,
    `number` VARCHAR(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我想了解如何处理这种方法?你会选哪一个。第一个还是后一个?任何有关改进的建议都将受到赞赏。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

我会做的是,可能会从id列中删除并使number成为表的主键,因为您更有可能按顺序执行搜索,联接等数字而不是id列。 number列也可以自动生成,因此不会出现问题。

答案 1 :(得分:1)

我认为保留一个单独的表不是一个好主意,因为order_number与订单直接相关。

如果您仍然打算保留不同的表格,请将“add_date”与数字一起使用。我发现'add_date'比订单号更加丑陋。

如果添加订单的确切时间无效(通常情况属实),您可以保留一个单独的表格,其中包含customer_idorder_number(主键),order_date