Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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_Database Design - Fatal编程技术网

Sql 多个表需要一对多关系

Sql 多个表需要一对多关系,sql,database-design,Sql,Database Design,我有一个包含多个表的SQL数据库:a、B、C、D。这些表中的实体是完全不同的东西,具有不同的列,它们之间的关系也不同。 然而,它们都有一个共同点:需要一个评论系统,在这种情况下,该系统将具有相同的结构:作者id、日期、内容等 我想知道对于这个模式来说,哪种策略最适合使用注释系统的A,…D表。在一个经典的“博客”网站中,我会在“评论”表中使用一对多关系和post_id 这里看起来我需要一个A_注释、B_注释等表来处理这个问题,这看起来有点奇怪 有更好的方法吗?您不需要为每一个单独的注释表创建注释表

我有一个包含多个表的SQL数据库:a、B、C、D。这些表中的实体是完全不同的东西,具有不同的列,它们之间的关系也不同。
然而,它们都有一个共同点:需要一个评论系统,在这种情况下,该系统将具有相同的结构:作者id、日期、内容等

我想知道对于这个模式来说,哪种策略最适合使用注释系统的A,…D表。在一个经典的“博客”网站中,我会在“评论”表中使用一对多关系和post_id

这里看起来我需要一个A_注释、B_注释等表来处理这个问题,这看起来有点奇怪


有更好的方法吗?

您不需要为每一个单独的注释表创建注释表,一个就足够了。每个注释都有一个唯一的ID,因此您不必担心冲突。

我对更多不同对象类型的注释也有类似的“问题”(例如,在我的例子中,文章和商店,每种类型都有自己的表)

我所做的:在我的评论表中,我有两列管理链接:

  • object\u type
    (),用于确定要链接到的对象/表,以及
  • object\u id
    (与其他表(或其中最大的表)的主键匹配的无符号整数类型),该类型指向特定表中的确切行
然后,列结构为:
id
对象类型
对象id
作者id
日期
内容
,等等


重要的是在这两列上都有一个索引,
(object\u type,object\u id)
,以加快索引速度。

您可以有一个注释表,该表中有一个列,其中包含一个值,区分注释所属的表-即该列中的1表示它是表a的注释,表B为2,依此类推。如果您不想在注释表中包含“神奇数字”,您可以使用另一个只有两列的表:一列包含数字,另一列详细说明数字所代表的表。

我猜想您所说的是一个注释表,外键“恰好是”a、B、C或D中的一个

SQL无法处理这一事实是其基本弱点之一。这个问题被一次又一次地问

参见,例如

约束是从“单个注释”表到视图的“外键”,视图是a、B、C和D中标识符的并集。SQL只支持外键到基表

请注意,SQL作为一种语言确实以CREATE断言的形式支持您的情况。但是,据我所知,没有支持该语句的SQL产品

编辑
您还应该记住,对于“单个”注释表,您可能需要在a、B、C和D中的键之间强制不相交,否则可能会发生注释自动在不同表的实体引用之间“共享”的情况,这可能是不可取的。

创建一个带有
注释id
主键和注释的各种属性的
注释

另外,创建一条注释,这样:

CREATE TABLE A_comment (
    comment_id PRIMARY KEY REFERENCES comment(comment_id),
    A_id REFERENCES A(A_id)
)
对B、C和D也要这样做。这确保了
注释
和所有其他表之间的引用完整性,如果将A、B、C和D的ID直接存储在
注释
中,则无法做到这一点

声明
A\u comment.comment\u id
作为主键可确保注释只能属于A中的一个条目。这不会阻止注释属于A中的一个条目和B中的一个条目,但使用外键只能实现这么多;这需要数据库级别的约束,据我所知,没有数据库支持这种约束


这种设计也不能防止孤立的注释,但我想不出任何方法来防止SQL中出现这种情况,当然,除了做您想要避免的事情:创建多个注释表。

旁注:表没有关系,它们是关系(或者至少,如果SQL正确地实现了关系模型,它们会是关系)。“他们之间的关系。”马塞洛,有趣的是,你能把它扩大一点吗?(虽然我英语很好,但它不是我的母语)。表本身是如何处理关系的?这不是一个真正的英语问题,而是一个数据库术语的问题。关系在关系模型中是一个非常具体的概念(非正式地说,是一组带有头的元组);它在SQL中的对应项是表。当您提到表之间的“关系”时,您真正的意思是外键,它是表之间约束的一种特殊情况,可以随意地称为关系。但是你应该避免使用“关系”这个词,以免与这个词的形式意义混淆。关系这个词来自数学。这是一组有序元组。数据的关系模型源自关系数学。使用单词relationships来表示表之间的关联有助于提高清晰度。这在其他语言中可能会产生非常不同的结果。可能是Nice的重复,我搜索了semilar解决方案,但我想保持我的数据库规范化,知道如何管理千个表之间的关系吗?