2017-08-25 39 views
1

我正在使用MySQL,我希望有一个表hand,它将包含固定数量card s(假设3例如,但我实际上需要8)。我需要存储这些hand的每一个,但不需要复制现有的hand。通过“复制”,我的意思是避免有两个包含相同数据的记录,如手(1,2,3)和手(2,1,3)。如何为包含指向同一表的多个外键的表构建(My)SQL表结构

目前,我有这样的:

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) 

但它迫使我去尝试INSERT之前已有hand检查时,所有的可能性,这是这将花费几个小时在一个 s到写请求。

有没有简单的方法来完成这个?

回答

2

我认为最好是在储存双手时加入一点额外的逻辑。

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

+0

菜鸟,请评论前阅读完整的答案。唯一的约束只是一个侧面说明。重点在于,在存储它们之前,您应该将手中的卡片分类。如果不清楚的话,我修改了文字。 – GolezTrol

+0

我现在明白了:)对不起,这样做更有意义。感谢您的额外解释 – Noob

-1

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

+0

与唯一约束或唯一索引相同,但它不能解决问题中提到的问题。你仍然可以插入2,1,3和1,2,3,这应该被视为相同。 – GolezTrol

-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); 
+0

这是一个意见,它取决于你想如何规范化你的数据库。为了可用性和性能,您可能需要进行非规范化处理,尤其是当您拥有允许数量有限的特定游戏的数据库时。除此之外,你的答案可能是一个有用的评论,但它不以任何方式回答这个问题。 – GolezTrol

相关问题