数据库设计:来自单个表的一对一关系?

use*_*992 1 mysql sql database database-design

对于学校科目,我必须制作一个具有不同类型关系的小型应用程序:一对一、一对多、多对多。

例如,如果来自同一个表“用户”的 2 个用户 ID 之间的关系状态(已婚/有关系)仍然是一对一的关系?

例如:

表 1:“用户”

用户 ID (PK) | 用户名 | 密码 | 注册日期

表 2:“关系”

用户_one_id (FK) | 用户二号 (FK) | 地位

这是一对一数据库的正确示例吗?还是它本身必须是两个表之间的连接以及连接它们的外部表?

小智 5

简短的回答是不是。

当您在两个表的主键之间建立关系时,就会得到一对一的关系。

采纳您的想法:假设我们有一群用户,但我们在如下表中跟踪他们的登录信息:

CREATE TABLE users (
    user_id int NOT NULL PRIMARY KEY,
    username varchar,
    password varchar);
Run Code Online (Sandbox Code Playgroud)

还有一个像这样的表:

CREATE TABLE user_personal(
    user_id int NOT NULL PRIMARY KEY,
    age int,
    firstname varchar,
    lastname varchar)
Run Code Online (Sandbox Code Playgroud)

创建两个表后,很容易看到每个表中都有一个具有相同数据类型 (user_id) 的列,该列用作该表的主键。

如果使用 user_id 作为键在两个表之间建立关系,那么您就建立了一对一的关系,因为 user_id 在任一表中只能出现一次。

这可能看起来有点奇怪,因为您可能会问为什么要这样分离数据。为什么要区分一个表中包含的数据字段而不是另一个表中包含的数据字段?一种简单的解决方案是数据隔离。假设我们修改了第二个表来显示这一点:

CREATE TABLE user_personal(
    user_id int NOT NULL PRIMARY KEY,
    age int,
    firstname varchar(255),
    lastname varchar(255),
    home_address varchar(255),
    social_security_number int)
Run Code Online (Sandbox Code Playgroud)

我们可能希望向某些人授予某些数据的访问权限,但不向其他人授予访问权限。如果您有用户关系表,那么向某些人展示人们之间的家庭/友谊关系可能会很好,但您不想泄露他们的社会安全号码和家庭住址。您可能分离出数据的另一个重要原因是,如果您的表中包含大量数据(想想数百列),并且在任何特定时间只有一些数据会更新。如果您有数百万条记录需要更新,但只有某些列一起更新,而其他列则保持相当静态,您可以将该表分成两个具有一对一关系的表,以防止数据库性能在更新过程中陷入困境。更新流程。