Database design 数据库中具有FK/PK关系的列是否应命名?

Database design 数据库中具有FK/PK关系的列是否应命名?,database-design,naming-conventions,Database Design,Naming Conventions,数据库表中具有PK/FK关系的列应如何命名?它们的名称是否应该包含对它们所在表的引用?考虑下面的例子。每个员工都有一个ID,该ID是工资表中的FK /* Employees Option 1*/ CREATE TABLE dbo.Employees ( EmployeeID INT PRIMARY KEY, EmployeeFirstName VARCHAR(32), EmployeeLastName VARCHAR(32), EmployeeEmail

数据库表中具有PK/FK关系的列应如何命名?它们的名称是否应该包含对它们所在表的引用?考虑下面的例子。每个员工都有一个ID,该ID是工资表中的FK

/* Employees Option 1*/
CREATE TABLE dbo.Employees 
( 
    EmployeeID INT PRIMARY KEY, 
    EmployeeFirstName VARCHAR(32), 
    EmployeeLastName VARCHAR(32), 
    EmployeeEmail VARCHAR(255) -- , ... 
)


/* Employees Option 2*/
CREATE TABLE dbo.Employees 
( 
    EmployeeID INT PRIMARY KEY, 
    FirstName VARCHAR(32), 
    LastName VARCHAR(32), 
    Email VARCHAR(255) -- , ... 
)

/* Employees Option 3*/
CREATE TABLE dbo.Employees 
( 
    ID INT PRIMARY KEY, 
    FirstName VARCHAR(32), 
    LastName VARCHAR(32), 
    Email VARCHAR(255) -- , ... 
)

/* Salaries Option 1*/
CREATE TABLE dbo.Salaries 
( 
    EmployeeID INT, 
    Salary INT
)

/* Salaries Option 2*/
CREATE TABLE dbo.Salaries 
( 
    Employee INT, 
    Salary INT
)
我在面向对象编程方面比数据库设计方面有更多的经验。使用OOP命名类的属性时,您不希望重复类的名称,因为它是多余的(Employee.ID不是Employee.EmployeeID)。因此,我认为上面的员工选项3和工资选项1是最好的,因为我将如何在OOP中命名类的属性


我说得对吗?还有什么我应该考虑的适用于数据库设计而不适用于OOP的吗?

我实际上最喜欢Option2,因为如果我有几个带有列
ID
(我经常这样做)的表,我可以将其写成
E.EmployeeID,p.ProjectID,T.TaskID
,而不是
E.ID,p.ID,T.ID
,这在我看来更容易阅读。通常情况下,单独表格的列差异很大,我只对ID列执行此操作。

我实际上最喜欢选项2,因为如果我有多个表格的列
ID
(我经常这样做),我可以将其编写为
E.EmployeeID,p.ProjectID,T.TaskID
,而不是
E.ID,p.ID,T.ID
,这在我看来更具可读性。通常情况下,单独表格中的列差异很大,因此我只对ID列执行此操作。

ISO 11179对命名有一些好处。我推荐它

数据元素的命名应始终根据它们是什么而不是它们在结构中的位置。此外,它们在名称空间、模式或它们出现的其他上下文中应该是唯一的。名称应仅包含通常理解的缩写

在此基础上,EmployeeID是员工标识符的合理名称。ID是个坏名字,因为它告诉你没有什么有用的东西


此外,外键属性的命名应该与它们引用的键属性相同(因为它们通常隐式地是相同的数据元素,只是在不同的表中),这是一个被广泛观察的约定。我通常唯一会打破这个规则的是,如果一个表包含两个外键,它们引用另一个表中的同一列。在这种情况下,名称显然需要不同,以避免命名冲突。

ISO 11179对命名有一些好处。我推荐它

数据元素的命名应始终根据它们是什么而不是它们在结构中的位置。此外,它们在名称空间、模式或它们出现的其他上下文中应该是唯一的。名称应仅包含通常理解的缩写

在此基础上,EmployeeID是员工标识符的合理名称。ID是个坏名字,因为它告诉你没有什么有用的东西


此外,外键属性的命名应该与它们引用的键属性相同(因为它们通常隐式地是相同的数据元素,只是在不同的表中),这是一个被广泛观察的约定。我通常唯一会打破这个规则的是,如果一个表包含两个外键,它们引用另一个表中的同一列。在这种情况下,名称显然需要不同,以避免命名冲突。

我曾经普遍使用Id(选项3),尽管我认为我已经开始使用全名(EmployeeId),明确目的是让FKs与PKs同名


工资绝对应该是选项2(EmployeeId)。工资。员工很糟糕,尤其是当你使用某种希望员工成为参考实体的ORM时。

我曾经普遍使用Id(选项3),尽管我认为我已经开始使用全名(EmployeeId),明确目的是让FKs与PKs同名


工资绝对应该是选项2(EmployeeId)。工资。员工很糟糕,尤其是如果你使用某种ORM,希望员工成为参考实体。

@dportas很好地涵盖了要点

下面是如何定义这些表的示例

create table dbo.Employee
(
    EmployeeId int not null primary key,
    FirstName nvarchar(100) not null,
    LastName nvarchar(100) not null,
    Email nvarchar(255) not null,
)

create table dbo.Salary
(
    EmployeeId int not null 
        foreign key references dbo.Employee (EmployeeId),
    BeginDate datetime not null,
        primary key (EmployeeId, BeginDate),
    EmploymentClassificationId int not null 
        foreign key references dbo.EmploymentClassification (EmploymentClassificationId),
    PerWeekAmount money not null,
)
我是否应该考虑其他适用于数据库设计而不适用于OOP的东西

这是一个关于数据库设计的邀请吗?嗯……好的

数据库设计与OOP有很大的不同。DB就是要准确地表示世界的状态,而OOP的目标是完成工作。对象表示一个实体,而表中的一行表示一个(希望是真的)命题

我对DB设计的建议是为每个表构造一个命题,精确地说明该表中的一行代表什么。然后设计系统,使这些命题始终为真(以及表中缺少的行)。而且,由于表与对象有着本质的不同,如果一个实体能够准确地表示所建模的事实,那么不要害怕跨多个表来表示它

通常,最好关注应该从数据生成何种报告,而不是应用程序将如何创建或使用数据


在基本关系中,NULL表示“未知”。这并不意味着“不适用”。如果存在不适用数据的空间,则说明设计有问题。

@dportas很好地涵盖了要点

下面是如何定义这些表的示例

create table dbo.Employee
(
    EmployeeId int not null primary key,
    FirstName nvarchar(100) not null,
    LastName nvarchar(100) not null,
    Email nvarchar(255) not null,
)

create table dbo.Salary
(
    EmployeeId int not null 
        foreign key references dbo.Employee (EmployeeId),
    BeginDate datetime not null,
        primary key (EmployeeId, BeginDate),
    EmploymentClassificationId int not null 
        foreign key references dbo.EmploymentClassification (EmploymentClassificationId),
    PerWeekAmount money not null,
)
我是否应该考虑其他适用于数据库设计而不适用于OOP的东西

这是一个关于数据库设计的邀请吗?嗯……好的

数据库设计与OOP有很大的不同。DB就是要准确地表示世界的状态,而OOP的目标是完成工作。对象表示一个实体,而表中的一行表示一个(希望是真的)命题

我的建议