一列中有多个外键?
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
.
如果你想知道一窝(同时出生的一群小狗)的兄弟姐妹,前面的工作。如果您需要跟踪不同窝之间的兄弟姐妹,请添加 mother
和 father
引用:
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`
);
您也可以只将 mother
和 father
列添加到 dogs
table 并删除 litters
table(在在这种情况下,垃圾特定信息将会丢失)。
我正在尝试为狗的主页创建一个数据库。
我使用 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
.
如果你想知道一窝(同时出生的一群小狗)的兄弟姐妹,前面的工作。如果您需要跟踪不同窝之间的兄弟姐妹,请添加 mother
和 father
引用:
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`
);
您也可以只将 mother
和 father
列添加到 dogs
table 并删除 litters
table(在在这种情况下,垃圾特定信息将会丢失)。