繁体   English   中英

具有外键的表可以引用不同的表

[英]Table with foreign key that can reference different tables

我正在尝试为收件箱应用程序构建一个表,该表将其消息存储在inbox表中。

该表的结构如下:

inbox_id|sender_id|receiver_id|subject|message

sender_idreceiver_id外键和可以引用多个表。

数据库中目前有3种类型的用户,他们都可以相互发送消息。 类型UserType1可以将消息发送到UserType2 ,反之亦然,或者UserType1可以将消息发送到UserType1 因此,接收方和发送方可以引用这三个表之一。

我对这个问题的解决方案是建立一个包含每个用户类型的列的inbox_user表,并让sender_idinbox_user引用它。

我主要关心的是解决方案的灵活性有限以及资源的浪费。 我将始终始终每行有2个空列。 如果我引入更多的用户类型,那将变得更糟。

这会被视为不良做法吗? 有哪些更灵活,更智能的设计?

从您的描述看来,最佳做法应该应用于用户表,而不是此收件箱表。 当然,我不知道您的约束,但是如果您有2或3种类型的用户,而每种类型的用户都在自己的表中,那是一个糟糕的设计(同样,不知道您的约束)。 首选项是将所有用户存储在一个表中,并带有一列以指示其类型。 然后,发件人和收件人FK都指向同一用户表,因此对收件箱表的引用变得简单明了。

否则,您将最终使用多列来引用您所说的每个表(UserTypeASenderID,UserTypeBSenderID,UserTypeCSenderID等)。 我的首选是拥有空的FK列并获得引用完整性,而不是实施其他解决方案并失去约束。

3种不同类型的用户是经典类型/子类型的情况。 (或者,如果您愿意,可以选择类/子类)。 有几种方法可以设计类/子类情况。 Martin Fowler解释说,对我来说不错的两个是“类表继承”和“单表继承”。 您可以在线找到简介。 您还可以在这里访问这些名称的标签,阅读显示的信息,并查看标记的问题。

正如您在Q中指出的那样,单表继承的某些字段有时会出现很多NULL,这对您来说可能是,也可能不是问题,具体取决于您的情况。

当在子类(子类型)中创建新条目时,类表继承涉及一些编程。 它还涉及更多的联接,但是联接不是很昂贵。 类表继承通常与称为共享主键的技术结合使用。 在这种技术中,子类表以一个主键结束,该主键与超类表中的主键重复。 它也是超类表的外键。 这使连接子类数据和超类数据变得简单,容易和快速。

共享主键解决了您在Q中陈述的难题,即如何用一个外键引用多个表。 其他表中对超类表的外键引用也将是对至少一个子类表的引用。 这看起来像魔术。 试试看,看看是否喜欢。

暂无
暂无

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

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