mysql - mysql 表中的每个主键和外键使用唯一的列名称以避免歧义情况

标签 mysql database-design foreign-keys relational-database

以下哪种方法更好:-

  1. 在所有表中每列、主键和外键使用唯一的列名。

示例 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/

    相关文章:

    MySQL 如何将 WHERE 子句应用于除一列之外的所有选定列?

    php - 如何在不同时间将2条记录存储在同一列上?

    mysql - 使用另一个表中接近的值更新一个表

    mysql - 带有 ModWSGI 和 flask 的 SQLAlchemy 中的 "Unknown MySQL Server"

    python - Django:相关模型中外键总计值的正确方法

    database-design - SaaS 数据库设计 - 多个数据库? split ?

    mysql - 如何在不硬编码的情况下提前两个月引入日历类型的数据?

    sql - 如何在数据库中表示一个实体的许多相似属性?

    mysql - 我在尝试添加外键时不断收到错误,我做错了什么?

    mysql - 无法创建外键约束?