当有多个表可供选择时,存储收藏夹的最有效方法是什么。
例如:您有一个用户(id,name,…)、食物(id,卡路里,…)、鸡尾酒(id,酒精,…)和糖果(id,name,…),用户可以从这些表中选择多个元素。解决这个问题的最好办法是什么。
我的想法是创建一个多对多关系,其中我有一个与上面的每个表(用户食物、用户鸡尾酒、用户糖果)相关的用户,或者一个最喜欢的表,其中我有上面提到的所有表的外键。
我想后者不是最佳解决方案。
当有多个表可供选择时,存储收藏夹的最有效方法是什么。
例如:您有一个用户(id,name,…)、食物(id,卡路里,…)、鸡尾酒(id,酒精,…)和糖果(id,name,…),用户可以从这些表中选择多个元素。解决这个问题的最好办法是什么。
我的想法是创建一个多对多关系,其中我有一个与上面的每个表(用户食物、用户鸡尾酒、用户糖果)相关的用户,或者一个最喜欢的表,其中我有上面提到的所有表的外键。
我想后者不是最佳解决方案。
3条答案
按热度按时间vjrehmav1#
您可以创建
Favorite
表和添加FOREIGN KEY
从另外四张table它看起来像:
当我插入不存在的价值为糖果
它将引发异常
您可以通过以下sql脚本查询它们(可能创建一个视图):
如果您想要测试:sql fiddle test demo链接
6ss1mwsb2#
创建
favorite
表中的所有项类型都有一列。CREATE TABLE favorite
(id integer
AUTO_INCREMENT,
user integer,
food integer,
cocktail integer,
sweet integer,
PRIMARY KEY (id),
FOREIGN KEY (food)
REFERENCES food
(id),
FOREIGN KEY (cocktail)
REFERENCES cocktail
(id),
FOREIGN KEY (sweet)
REFERENCES sweet
(id),
UNIQUE (user,
food),
UNIQUE (user,
cocktail),
UNIQUE (user,
sweet));
CREATE TABLE item
(id integer
AUTO_INCREMENT,
PRIMARY KEY (id));
INSERT INTO item
SELECT NULL
FROM food
UNION ALL
SELECT NULL
FROM cocktail
UNION ALL
SELECT NULL
FROM sweet;
ALTER TABLE food
ADD (item integer,
FOREIGN KEY (item)
REFERENCES item
(id));
ALTER TABLE cocktail
ADD (item integer,
FOREIGN KEY (item)
REFERENCES item
(id));
ALTER TABLE sweet
ADD (item integer,
FOREIGN KEY (item)
REFERENCES item
(id));
UPDATE food
SET item = (SELECT count()
FROM food s
WHERE s.id <= food.id);
UPDATE cocktail
SET item = (SELECT count()
FROM cocktail s
WHERE s.id <= food.id)
+ (SELECT count()
FROM food);
UPDATE sweet
SET item = (SELECT count()
FROM sweet s
WHERE s.id <= food.id)
+ (SELECT count()
FROM food)
+ (SELECT count()
FROM cocktail);
ALTER TABLE food
MODIFY item integer
NOT NULL;
ALTER TABLE cocktail
MODIFY item integer
NOT NULL;
ALTER TABLE sweet
MODIFY item integer
NOT NULL;
CREATE TABLE favorite
(user integer,
item integer,
PRIMARY KEY (user,
item),
FOREIGN KEY (user)
REFERENCES user
(id),
FOREIGN KEY (item)
REFERENCES item
(id));
x9ybnkn63#
你基本上有两个选择:
这是简短、简洁的,允许您添加新的实体。
或者,您可以分别列出每一项:
这不太简洁,但允许添加显式外键引用。如果需要的话,它还可以很容易地在一行中表示多个收藏夹。