Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Sql 将一个表与多个其他表的外键连接起来可以吗?_Sql_Performance_Foreign Keys_Multiple Columns_Database Schema - Fatal编程技术网

Sql 将一个表与多个其他表的外键连接起来可以吗?

Sql 将一个表与多个其他表的外键连接起来可以吗?,sql,performance,foreign-keys,multiple-columns,database-schema,Sql,Performance,Foreign Keys,Multiple Columns,Database Schema,假设我的数据库中有30个表,它们都与一个符号表有一对多的关系: 除了为其父级中的每一个都包含外键列(这对查询的性能影响较小)之外,还有什么方法可以设置注释表呢?预计这张桌子会越来越大 由于每个表示法都包含一个父表id,其余父表的id为29个空值,即每行跟踪29个空值,这看起来太多了 即。 从符号中选择文本、表1\u id、表2\u id、…、表30\u id将显示: id text table1_id table2_id // tab

假设我的数据库中有30个表,它们都与一个符号表有一对多的关系:

除了为其父级中的每一个都包含外键列(这对查询的性能影响较小)之外,还有什么方法可以设置注释表呢?预计这张桌子会越来越大

由于每个表示法都包含一个父表id,其余父表的id为29个空值,即每行跟踪29个空值,这看起来太多了

即。 从符号中选择文本、表1\u id、表2\u id、…、表30\u id将显示:

id         text         table1_id       table2_id      //     table30_id
0          "buzz"       74              null           //     null
1          "foo"        null            45             //     null
2          "bar"        22              null           //     null
3          "fizz"       22              null           //     null
4          "hello"      28              null           //     null
5          "world"      null            null           //     3
...etc
你不应该有一个符号表

主外键对的要点是外键的值与主外键的值相同。符号表没有意义。规范化是数据库的一个极其重要的方面。我们希望减少冗余和复制的数据。我们不想重复!符号表将引入冗余数据。在这种情况下,冗余数据可以指我们可以使用现有数据计算的数据。所有要标准化的表必须只包含与其自身相关的数据,并且不可计算

我们可以通过检查外键字段是否已填充以及相关表中是否存在该键来计算每个链接。因此,这些链接不适合放在单独的表中。正如您所提到的,这将是一个巨大的表,这正是它只保存冗余数据的原因。不需要符号表。如果需要查找链接,只需编写一个查询来检查主键和外键之间的匹配。这就是数据库使用外键的原因


只有在没有外键的情况下,符号表才合适。然后,我们需要一个表来告诉我们每个记录如何与不同表中的另一个记录相关。但是,由于您确实有外键,因此此表会导致重复和冗余数据。

您正确地认为,在一列不为NULL的位置存储30列是低效的—这些NULL值通常会占用每行的空间

假设所有ID都是相同的类型,可以简化结构以使用:

table_name
table_id
只有两列。不幸的是,我不知道有任何数据库允许有条件的外键关系。虽然我主张定义外键关系,但在这种情况下,您可能会选择不使用它们

这并不完全令人满意。尽管可以使用触发器确保某些完整性,但它缺少外键的级联特性。您可以使用更多触发器来实现这一点。恶心

一个备选方案是为每个表单独设置一个符号表:

notations_table1
    text, id

notations_table2
    text, id

. . . 
然后,您可以使用union all将这些功能组合在一起:

然后,基础表可以具有格式正确的外键约束,甚至是级联约束。不幸的是,它缺少一个列作为id。真正的id是table_name和id的组合


有些数据库还有其他机制可以提供帮助。例如,Postgres支持一种在这种情况下可能有用的继承形式。

欢迎使用。我相信对于这类问题来说可能是一个更好的网站,不是说它完全脱离主题,而是你可能会得到更好的结果。请在每篇文章中准确地问一个特定的、经过研究的、不重复的问题。在考虑发帖之前,请先阅读您的课本和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。反思你的研究。请参见,表决箭头鼠标悬停文本(&T)。如果你发布一个问题,用一句话作为标题。遵循适当的出版/权威教科书/手册/参考资料。问1个问题:你在哪里卡住了。效率:通过教科书、web和SO,特别是DBMS手册,学习查询引擎的关系和SQL优化/实现/性能的基本知识,所有这些都会立即导致索引、计划、统计和可搜索性。学习并应用这些基础知识后,请重新优化。PS:工程界没有最好的。对其进行足够详细的定义,并提供足够的相关细节,使所有人都能就估值达成一致。即使可以这样做,这里的问题也太多了。然后你需要解释为什么你不能自己评估。谢谢你的初级读物,@philipxy,我会把这些放在心上,我已经改写了我的问题。通过我在数据库方面的教育,我已经学会了我唯一的方法,但是还没有找到一种连接到许多必须列出每一列引用的表的解决方案。我相信除了我自己之外,还有其他一些人想知道的方法。我不明白这篇文章想问什么。你是说M:1?什么是有意义的?用引号引一个词并不重要
我不明白你的意思。PS请在代码问题中给出一个剪切、粘贴和可运行的代码,包括作为代码输入的最小代表性示例;期望和实际输出,包括逐字记录错误消息;标签和版本;清晰的说明和解释。对于包含DBMS和DDL(包括约束和索引)的SQL,以表格式作为代码输入。使用足够多的单词、句子和引用部分例子来清楚完整地说出你的意思。谢谢@gordon,这对我很有帮助@大卫德里科。如果这回答了你的问题,你可以考虑接受答案。
create view notations as (
    select text, id, 'table1' as table_name from notaions_table1 union all
    select text, id, 'table2' as table_name from notaions_table2 union all
    . . .