如何为包含指向同一个表的多个外键的表构建(My)SQL表结构

时间:2017-08-25 22:44:39

标签: mysql sql

我正在使用MySQL,我希望有一个表hand,其中包含固定数量的card s(例如,让我们说3,但实际上我需要8 )。我需要存储这些hand中的每一个,但不会复制现有的hand

通过"复制",我的意思是避免让两条包含相同数据的记录,如hand(1,2,3)和hand(2,1,3)。

我目前有这个:

CREATE TABLE card
(
    id int(11) NOT NULL,
    name varchar(255) NOT NULL,
)

CREATE TABLE hand
(
    id int(11) NOT NULL,
    card_1 int(11),
    card_2 int(11),
    card_3 int(11)
)

ALTER TABLE card ADD PRIMARY KEY (id)
ALTER TABLE hand ADD PRIMARY KEY (id)

ALTER TABLE hand ADD FOREIGN KEY (card_1) REFERENCES (card.id)
ALTER TABLE hand ADD FOREIGN KEY (card_2) REFERENCES (card.id)
ALTER TABLE hand ADD FOREIGN KEY (card_3) REFERENCES (card.id)

但它迫使我在hand之前检查现有的INSERT时尝试各种可能性,并且这是一个需要花费数小时写入8 card s的请求一个hand

有没有一种简单的方法可以实现这一目标?

3 个答案:

答案 0 :(得分:2)

我认为最好在储存手中放一些额外的逻辑。

如果您在插入卡之前先对卡进行排序。例如,如果您将它们从低到高排序,那么在数据库中不会是手(2,1,3),而只是手(1,2,3)。这使搜索更容易,或者,如果你对它进行了一个独特的约束,你可以尝试插入一个新的手并抓住它会在手存在时抛出的约束错误。

答案 1 :(得分:-1)

您是否需要单独的id列作为主键?如果没有,那么您可以使用这些卡列作为主键 ALTER TABLE hand ADD PRIMARY KEY (card_1,card_2,...card_n)  这会自动丢弃重复的值。

答案 2 :(得分:-1)

你手牌之间有一对多的关系。您应该使用复合主键和单个卡列来表示它。

CREATE TABLE hand(
id INT,
card INT,
FOREIGN KEY card REFERENCES card(id),
PRIMARY KEY (id,card)
);

如果手101包含1,2,3号牌,那么你用

表示
INSERT INTO hand(101,1);
INSERT INTO hand(101,2);
INSERT INTO hand(101,3);