lin*_*sek 3 mysql normalization database-design
这听起来像是一个愚蠢的问题,但我是一名刚接触数据库设计的软件开发人员......所以这个概念对我来说很有意义,但也许这并不适用——
表 B 中记录中的字段是否可以简单地指向表 A 中记录中的字段?
示例:如果我有两个表……一个包含所有员工的列表,另一个包含这些员工进出办公室的历史记录。
Employees
ID
First Name
Last Name
History
Event ID
Event Time
Event Type (Entry/Exit)
EmployeeID
Run Code Online (Sandbox Code Playgroud)
我可以使用外键在 History.EmployeeID 和 Employees.ID 之间建立关系,但会重复数据。那么 History.EmployeeID 和 Employees.ID 将包含相同的 ID 号,它们将在内存中存储两次。因此,如果我进入数据库并更改了 John Smith 的员工 ID,则需要编写脚本或其他内容来搜索数据库并查找/替换该 ID。
我想要的是Employees.ID 包含真实ID 和History.EmployeeID 只包含一个指向Employees.ID 的指针。这样,如果我更新 John Smith 的 ID,更改将集中到一张表中的一个字段。
这可能吗?
谢谢
即使 SQL 支持您描述的“指针”,指针本身也会占用一些内存。具有讽刺意味的是,指针甚至可能大于它指向的整数值。
你用 MySQL 标记了这个问题,所以我将回答关于 MySQL:不支持这个指针概念。在关系数据库中,列包含值,而不是指针。
约束是表元数据的一部分,用于确保外键列中的值不会与其引用的键列不同步。如果您声明具有级联效果的外键约束,它要么阻止更改,要么复制更改。
RDBMS 的其他实现可能具有此功能,但 MySQL 没有。
使用相同的术语像你一样,History.EmployeeID
是已经指向该员工的记录,但这样的Employees.ID
。两者都允许您的应用程序定位相应的记录。一般而言,数据库中的物理记录不一定保持其物理位置,因此不鼓励使用物理指针,如果它们可用(例如 Oracle 的ROWID
),则不鼓励使用,并且应仅限于一些非常特殊的情况。
除此之外,通常会选择表主键,以便它们通常不会更改,因此您提供的用例没有实际意义。