Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用一个值作为另一个表的标题——这是一种糟糕的做法吗?_Mysql - Fatal编程技术网

Mysql 使用一个值作为另一个表的标题——这是一种糟糕的做法吗?

Mysql 使用一个值作为另一个表的标题——这是一种糟糕的做法吗?,mysql,Mysql,假设我有下表: Table: Residents ID Name Species ------------------- 1 Bob Human 2 Fluffy Cat 3 Laura Human 根据物种的不同,我想参考不同的表格以获取更多信息。“种类”列下给出的值是相应表的名称 Table: Cat id owner_id fur_color ---------------------------- 2 1

假设我有下表:

Table: Residents

ID   Name    Species
-------------------
1    Bob      Human
2    Fluffy   Cat
3    Laura    Human
根据物种的不同,我想参考不同的表格以获取更多信息。“种类”列下给出的值是相应表的名称

Table: Cat

id     owner_id    fur_color
----------------------------
2        1          white


Table: Human

id      email
---------------
1       bob@gmail.com
3       laura@gmail.com

这样做是不好的做法吗?如果是这样,做类似事情的首选方法是什么?

最好有一个通用的属性和值表:

表:属性:

id  owner_id    attr    value
1   1           email   bob@gmail.com
2   3           email   laura@gmail.com
3   2           fur_color white

简言之,是的。正如@barmar在他的评论中提到的,没有办法将列值连接到表名(除了使用PHP之类的脚本语言动态构建查询之外)

花点时间分析一下表以及它们之间的关系。从您的示例扩展,人与宠物/动物之间存在“多对一”关系,因为人可以有多个动物,但动物不能有多个主人。如果动物可以有一个以上的主人,你就有一种“多对多”的关系

在模式方面,您的模式在最基本的级别上可能如下所示:

居民

  • 身份证
  • 名字
  • 电子邮件
动物

  • 身份证
  • OwnerID(必须与居民表中的ID匹配)
  • 名字
从外观上看,您将有不同类型的动物需要不同的属性(例如,爬行动物将没有毛皮颜色选项)。您只需添加另一个表,如@barmar建议的。不过,我会忽略人的属性,将它们保留在居民表中

动物颂词

  • 身份证
  • AnimalID(必须与动物表中的ID匹配)
  • 属性
  • 价值观
但是,此设置的唯一缺点是,您必须勤奋工作并确保属性存在,例如,不要忘记为Fluffy创建毛发颜色记录

如果动物和人之间存在多对多关系,则需要一个中间表,并从动物表中删除OwnerID列

所有权

  • 身份证
  • OwnerID(必须与居民表中的ID匹配)
  • AnimalID(必须与动物表中的ID匹配)

您想实现什么目标?无法将列值连接到表名。对于Fluffy的毛发颜色,Cat表中的所有者id不应该是
2