Mysql子表表示父表中关系键的替代值

时间:2015-09-18 23:43:42

标签: mysql relational-database

不太确定标题会解释它..

这是我的问题。我有一张代表产品的桌子。这些产品是按月分组的一部分。在结账时,一些产品也可以单独添加到订单中作为"插件"。 例如,订阅A附带一个包含产品1,2,3,3的盒子,但你可以添加任意多的3和4,因为它们也是插件。

我表示此数据的解决方案是拥有一个products表,然后是一个只存储产品ID的products_addons表。请参阅下面的布局。

products
id, name, price

products_addons
product_id

这样我可以加入表格,看看哪个产品也是插件,所以 我的id为3和4的示例产品将保存到product_addons表中。这似乎非常低效,我想知道是否有更好的方法 这个怎么样?我在考虑productsis_also_addon中的bool字段,但这似乎效率低下。

1 个答案:

答案 0 :(得分:1)

这是一个快速思考,以及我在该链接中对Junction Tables的记录。

-- drop table products;
create table products
(   prodId int auto_increment primary key,  -- sku, code, whatever
    isAssembly int not null, -- bool, whatever, for quick retrieval of just them
    descr varchar(255) not null,
    price decimal(10,2) not null -- varies here over time, but not in orderLines (frozen there)
);

-- drop table assemblies;
create table assemblies
(   -- this assemblies table is to give a description, and to be one of the two anchors to the Junction table
    -- but Orders still emanate from the products table
    ashId int auto_increment primary key,   -- trying to keep the column name clean
    descr varchar(255) not null -- 'October Chocolate Package'
);

-- drop table orders;
create table orders
(   ordId int auto_increment primary key,
    ordDate datetime not null
    -- etc customer blah blah blah
);

-- drop table orderLines;
create table orderLines
(   id int auto_increment primary key,
    ordId int not null,
    prodId int not null,    -- a product. Period. Can be an assembled product or not
    seq int not null,
    qty int not null,
    price decimal(10,2) not null, -- the frozen price upon placing the order
    CONSTRAINT fk_ol_orders FOREIGN KEY (ordId) REFERENCES orders(ordId),
    CONSTRAINT fk_ol_products FOREIGN KEY (prodId) REFERENCES products(prodId)
);

-- drop table paJunction;
create table paJunction
(   -- product/assembly junction table
    -- one row here for each product that is in an assembly
    id int auto_increment primary key,
    prodId int not null,
    ashId int not null,
    qty int not null,   -- how many prods go in that assembly
    unique key(prodId,ashId),   -- no dupes allowed
    unique key(ashId,prodId),   -- no dupes allowed
    CONSTRAINT fk_paJ_products FOREIGN KEY (prodId) REFERENCES products(prodId),
    CONSTRAINT fk_paJ_assemblies FOREIGN KEY (ashId) REFERENCES assemblies(ashId)
);

通过创建程序集,可以极大地灵活地对本月的软件包(或程序集)进行逐月调整。并允许重复使用你想要推广的旧版本,只需要很少的努力就可以再次使用。

维持定价历史记录。

允许用户在购物车中放置他们想要的任何内容。

我确信这些装配件需要一些人看到这个视觉效果。我可以把几个例子放在一起。

主要内容是使用Junction表,并从产品表中订购。