什么是“附加”表的正确名称?

时间:2009-12-31 19:09:05

标签: sql design-patterns terminology

我有一个表a,主键为id,表b代表a的专用版本(它具有跟踪{{ {1}}确实加上a的特定内容 - 后者都存储在b中。如果我决定通过让b的主键也是b的外键来表示这一点,a.idb相关的正确术语是什么?

真实世界的示例可能是带有aperson附加表的student表。 teacher也可能是student(例如TA),但它们都是相同的teacher

我称之为person的'子表',但我已经将其用作'详细信息表'的同义词,例如采购订单上的行。

4 个答案:

答案 0 :(得分:3)

您的设计听起来像Concrete Table Inheritance

我将表B称为扩展表A具体表。

这种关系是一对一


其他答案建议只存储特定于扩展表的列。此设计称为Class Table Inheritance

答案 1 :(得分:1)

好的,这是一个偏离主题但首先要做的事情,为什么B有A的所有列?它应该只有添加的列,特别是如果您使用foriegn键引用A。

“添加”记录通常称为“详细信息”

例如,假设我的表A是“汽车”,我的表B将是“CarDetails”

答案 2 :(得分:0)

正如Neil N所说,如果您通过外键引用表B中的表A,则不应该在两个地方都有列。

您的描述听起来有点像面向对象编程中的并行继承。就个人而言,在这种情况下,我不使用任何特定的命名约定。我将A命名为A,并将B命名为B。例如,我可能有:

CREATE TABLE People
(
     people_id      INT             NOT NULL,
     first_name     VARCHAR(40)     NOT NULL,
     last_name      VARCHAR(40)     NOT NULL,
     ...
     CONSTRAINT PK_People PRIMARY KEY CLUSTERED (people_id)
)
GO

CREATE TABLE My_Application_Users
(
     people_id          INT             NOT NULL,
     user_name          VARCHAR(20)     NOT NULL,
     security_level     INT             NOT NULL,
     CONSTRAINT PK_My_Application_Users PRIMARY KEY CLUSTERED (people_id),
     CONSTRAINT UI_My_Application_Users_user_name UNIQUE (user_name)
)
GO

这只是一个例子,所以请不要告诉我我的名字列太长或太短或者它们应该允许NULL等等;)

答案 3 :(得分:0)

  

与b相关的b的正确术语是什么?

B是表A(父级)的子级,因为为了使子级中存在记录,它必须首先存在于父级中。

表格应根据具体情况根据上下文建立一对多或多对一关系,并且这些选项可以是可选的或必需的。将两组列表链接在一起的表将以涉及的每个表以多对一的方式与其他表相关联。例如,usersgroupsuser_groups_xref - user_groups_xref可以支持user条记录的多个特定用户实例,以及与groups相同的关系{1}}表。

一对一的关系没有意义 - 永远不应允许这些存在,因为它应该只是一个表。