以下哪种方法更好:-
- 在所有表中每列、主键和外键使用唯一的列名。
示例 1:
CREATE TABLE projects (
project_id PRIMARY KEY,
project_name VARCHAR(30)
client_id INT,
fk_project_user_id INT, ( FOREIGN KEY )
projects_created_by INT, ( FOREIGN KEY )
);
CREATE TABLE clients (
client_id PRIMARY KEY,
client_name varchar(20),
fk_client_user_id INT,( FOREIGN KEY )
client_created_by INT, ( FOREIGN KEY )
)
- 不关心所有表中每个主键和外键的每个列名的唯一性。
示例2:
CREATE TABLE projects (
id PRIMARY KEY,
project_name VARCHAR(30)
client_id INT, ( FOREIGN KEY )
fk_user_id INT, ( FOREIGN KEY )
created_by INT ( FOREIGN KEY )
);
CREATE TABLE clients (
id PRIMARY KEY, (Same as above table)
client_id INT,
client_name varchar(20),
fk_user_id INT, ( FOREIGN KEY ) (Same as above table)
fk_client_id int, ( FOREIGN KEY )
created_by INT ( FOREIGN KEY ) (Same as above table)
);
当我们为具有多个表和所有表之间的关系的大型 ERP 规划数据库时?我为每个键使用了不同的名称,以避免在连接两个表时出现不明确的错误。
最好的解决方案是什么?
最佳答案
命名约定由您决定。您决定使用哪种命名约定并不重要。重要的是您始终遵循自己的约定,并将其记录下来,以便其他开发人员知道如何理解您的代码和架构。
有些人选择为每个表指定一个名为id
的主键。如果他们的每个表都必须有一个名为 id
的列,那么他们就可以为针对任何表的某些查询编写可重用的代码。
但是,此约定不考虑复合主键。此外,如果您的查询执行联接,则查询结果集可能会有多个名为 id
的列,除非您定义列别名。
当我设计数据库时,我会以描述性的方式命名我的主键。例如,projects.project_id
。这避免了联接结果集中重复列名的问题。当您在查询或结果集中看到该列时,它还可以让您更清楚地了解该列的含义。
我喜欢将外键命名为与其引用的主键列相同的名称,这样我可以这样做而不会导致冲突。
但请考虑这个示例,其中同一个表中有多个引用 Users.user_id
的外键。
CREATE TABLE Bugs (
bug_id INT PRIMARY KEY,
description TEXT NOT NULL,
reported_date DATETIME NOT NULL,
user_reported_by INT NOT NULL,
user_assigned_to INT,
user_verified_by INT,
FOREIGN KEY (user_reported_by) REFERENCES Users(user_id),
FOREIGN KEY (user_assigned_to) REFERENCES Users(user_id),
FOREIGN KEY (user_verified_by) REFERENCES Users(user_id)
);
您不能假设可以使用公共(public)列名,因为需要多个外键引用同一个表是正常的,如上面的示例所示。因此,您必须允许 FK 列名称与其引用的 PK 不同。
关于mysql - mysql 表中的每个主键和外键使用唯一的列名称以避免歧义情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49241007/