在 mysql table 中为每个主键和外键使用唯一的列名以避免出现歧义

Using of unique column name for each primary and foreign keys in mysql table to avoid ambiguous condition

以下哪种方法更好:-

  1. 在所有 table.
  2. 中为每个列、主键和外键使用唯一的列名

示例 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 )
)
  1. 不关心所有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 不同。