在 mysql table 中为每个主键和外键使用唯一的列名以避免出现歧义
Using of unique column name for each primary and foreign keys in mysql table to avoid ambiguous condition
以下哪种方法更好:-
- 在所有 table.
中为每个列、主键和外键使用唯一的列名
示例 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 )
)
- 不关心所有table中每个主键和外键的每个列名的唯一性。
示例 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)
);
当我们为具有多个 table 和所有关系的大型 ERP 规划数据库时?我为每个键使用了不同的名称,以避免在我们连接两个 table 时出现模棱两可的错误。
最好的解决方案是什么?
命名约定由您决定。您决定使用哪种命名约定并不重要。重要的是您始终如一地遵循自己的约定,并将其记录下来,以便其他开发人员知道如何理解您的代码和架构。
有些人选择给每个 table 一个名为 id
的主键。如果他们的每个 table 都必须有一个名为 id
的列,那么他们可以为针对任何 table.
的某些查询编写可重用代码
但是,此约定不考虑复合主键。此外,如果您的查询执行连接,则查询结果集可能有多个名为 id
的列,除非您定义列别名。
当我设计数据库时,我以描述性的方式命名我的主键。 projects.project_id
例如。这避免了连接结果集中列名重复的问题。当您在查询或结果集中看到列时,它还使列的含义更加清晰。
我喜欢将外键命名为与其引用的主键列相同的名称,前提是我可以这样做而不会导致冲突。
但是考虑这个例子,在同一个 table 中有多个外键引用 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)
);
您不能假设您可以使用通用的列名,因为需要多个外键引用同一个 table 是正常的,如上例所示。因此,您必须允许 FK 列名称与其引用的 PK 不同。
以下哪种方法更好:-
- 在所有 table. 中为每个列、主键和外键使用唯一的列名
示例 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 )
)
- 不关心所有table中每个主键和外键的每个列名的唯一性。
示例 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)
);
当我们为具有多个 table 和所有关系的大型 ERP 规划数据库时?我为每个键使用了不同的名称,以避免在我们连接两个 table 时出现模棱两可的错误。
最好的解决方案是什么?
命名约定由您决定。您决定使用哪种命名约定并不重要。重要的是您始终如一地遵循自己的约定,并将其记录下来,以便其他开发人员知道如何理解您的代码和架构。
有些人选择给每个 table 一个名为 id
的主键。如果他们的每个 table 都必须有一个名为 id
的列,那么他们可以为针对任何 table.
但是,此约定不考虑复合主键。此外,如果您的查询执行连接,则查询结果集可能有多个名为 id
的列,除非您定义列别名。
当我设计数据库时,我以描述性的方式命名我的主键。 projects.project_id
例如。这避免了连接结果集中列名重复的问题。当您在查询或结果集中看到列时,它还使列的含义更加清晰。
我喜欢将外键命名为与其引用的主键列相同的名称,前提是我可以这样做而不会导致冲突。
但是考虑这个例子,在同一个 table 中有多个外键引用 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)
);
您不能假设您可以使用通用的列名,因为需要多个外键引用同一个 table 是正常的,如上例所示。因此,您必须允许 FK 列名称与其引用的 PK 不同。