繁体   English   中英

创建通用链接表是一个坏主意吗?

[英]Is it a bad idea to make a generic link table?

想象一下具有高度规范化的元数据库。 如果我试图在这里描述它,它将炸毁该输入字段。 但是想像一下,整个数据库,所有表中的每个关系都通过一个称为link的表。 它具有以下字段: master_class_id,master_attr_id,master_obj_id,class_id2,obj_id2 该表可以轻松表示各种关系:1:1、1:n,m:n,self:self。

我看到该表将变得HUUUUGE的问题。 那是不好的做法吗?

这在两个帐户上是错误的:

  1. 这将是所有查询的巨大瓶颈,并且将消除吞吐量的任何机会。

  2. 设计不良的后果是:您应该能够更简洁,更接近现实地描述事物。 如果这确实是存储数据的最佳方法,则可以考虑分区甚至其他范式,而不是关系型

一句话, 是的这是一个坏主意

在不涉及太多细节的情况下,我将提供以下内容:

  • 对于元数据库,链接表应按(高级)实体划分:也就是说,每个实体都应有单独的链接表
  • 实体之间的链接需要另一个链接表

通常,高层实体很容易识别,例如客户。

这通常是不好的做法,但不是因为表很大。 问题是您正在将不相关的数据混合在一张表中。

之所以将链接保留在单独的表中,是因为您不需要一起使用它们。

数据本身也是一个常见的错误: 您不应仅在一个表中混合两组数据,因为如果数据本身不相关,则字段相似。

关系数据库实际上不适合该模型。

可以实现它,但是会很慢。 主要缺点是您将无法有效地索引链接。

但是,此设计在两种情况下可能有用:

  1. 这仅存储元数据:实体之间的声明关系。 实际数据存储在普通的关系表中,因此此链接仅用于显示结构,而不用于实际查询中。

  2. 这会存储一些结构复杂但包含很少数据的结构,因此易于开发会加重性能缺陷。

这种设计可以在几个ORM看到(我什至开发了一个)。

我仍然看不到这种类型的桌子的目的。 如果表A与表B一对多,则A将仍然具有PK,而B将仍然具有PK。 A通常包含B的FK。

因此,在Master_Table中,您将必须存储A PK,B FK,这仅是已经存在的副本。 您唯一会丢失的是表A中的FK,但您只是将其迁移到了一个巨大的表中,数据库,dba和使用db进行编码的任何人都难以处理。

这些表最经常出现在Access中,并显示在DailyWTF上,因为它们难以阅读和理解。

哦! 一个主要问题是,要使该表无处不在,您将必须创建通用列,这可能最终会破坏数据完整性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM