我有一个表a
,主键为id
,表b
代表a
的专用版本(它具有跟踪{{ {1}}确实加上a
的特定内容 - 后者都存储在b
中。如果我决定通过让b
的主键也是b
的外键来表示这一点,a.id
与b
相关的正确术语是什么?
真实世界的示例可能是带有a
和person
附加表的student
表。 teacher
也可能是student
(例如TA),但它们都是相同的teacher
。
我称之为person
的'子表',但我已经将其用作'详细信息表'的同义词,例如采购订单上的行。
答案 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
(父级)的子级,因为为了使子级中存在记录,它必须首先存在于父级中。
表格应根据具体情况根据上下文建立一对多或多对一关系,并且这些选项可以是可选的或必需的。将两组列表链接在一起的表将以涉及的每个表以多对一的方式与其他表相关联。例如,users
,groups
和user_groups_xref
- user_groups_xref
可以支持user
条记录的多个特定用户实例,以及与groups
相同的关系{1}}表。
一对一的关系没有意义 - 永远不应允许这些存在,因为它应该只是一个表。