一列中有多个外键?

Multiple foreign keys in one column?

我正在尝试为狗的主页创建一个数据库。
我使用 mysql 和 php。每只狗都有一个dog_id(PRIMARY KEY),可以通过

来识别它 现在,我希望能够link一只狗给它的兄弟姐妹。这里的问题是兄弟姐妹的数量可能在 0 到 25 之间的任何地方。因此,我不确定该怎么做。

这是我的第一次尝试

TABLE `dogs` (
    `dog_id` INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto incremented PRIMARY KEY',
    `dog_sibling1` INT(11) COLLATE utf8_unicode_ci NULL COMMENT 'FOREIGN KEY dog_id of the dog\'s 1st sibling',
    `dog_sibling2` INT(11) COLLATE utf8_unicode_ci NULL COMMENT 'FOREIGN KEY dog_id of the dog\'s 2nd sibling',
     and so on....
     );

我在这里看到的问题是最坏的情况是我最终得到 25 列 NULL 并且大多数时候有很多 NULL 列。

我的第二次尝试

TABLE `dogs` (
        `dog_id` INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto incremented PRIMARY KEY',
        `dog_sibling_ids` INT(11) COLLATE utf8_unicode_ci NULL COMMENT 'FOREIGN KEY dog_ids of the dog\'s siblings',
         );

像这样我只有一列,但我不知道是否可以在一列中保存一组外键?而且我也不确定如何在 php 中处理这个问题。

有没有更好的方法来解决这个问题?

你最好的选择可能是 table 'groups' 兄弟姐妹在一起。

CREATE TABLE dog_siblings (
   sibling_group_id INTEGER,
   dog_id integer
);

这样,如果dog_ids5-9都是相关的,他们只需要在新的table中共享一个共同的sibling_group_id,你就可以找到所有相关的狗使用类似于以下的查询

SELECT ds2.dog_id
FROM dogs d
    INNER JOIN dog_siblings ds
        ON d.dog_id = ds.dog_id AND d.dog_id = 1
    INNER JOIN dog_siblings ds2 
        ON ds.sibling_group_id = ds2.sibling_group_id

这会为您提供所有与 id 为 1 的狗(包括狗 1)的兄弟姐妹的狗

(编辑:愚蠢的无法发表评论,老实说,我正在制作这个时出现了对 op 的评论)

我会制定一个类似于您在问题中建议的解决方案:创建一个名为 siblings 的 table 并从 dogs table 引用它:

CREATE TABLE `siblings` (
    `siblings_id` INTEGER PRIMARY KEY
);

CREATE TABLE `dogs` (
    `dog_id` INTEGER PRIMARY KEY,
    `dog_sibling_id` INTEGER REFERENCES `siblings`
);

我不会引用 siblings table 到 dogs table 因为它显然是一对多关系(一个兄弟姐妹组可以有很多狗,但一只狗只能属于一个兄弟组)。那些没有兄弟姐妹的狗呢?您也可以为这些狗创建一个兄弟姐妹组,或者将 dog_sibling_id 保留为 NULL.

如果你想知道一窝(同时出生的一群小狗)的兄弟姐妹,前面的工作。如果您需要跟踪不同窝之间的兄弟姐妹,请添加 motherfather 引用:

CREATE TABLE `litters` (
    `litter_id` INTEGER PRIMARY KEY,
    `mother_id` INTEGER REFERENCES `dogs`,
    `father_id` INTEGER REFERENCES `dogs`
);

CREATE TABLE `dogs` (
    `dog_id` INTEGER PRIMARY KEY,
    `dog_litter_id` INTEGER REFERENCES `litters`
);

您也可以只将 motherfather 列添加到 dogs table 并删除 litters table(在在这种情况下,垃圾特定信息将会丢失)。