我是否应该更喜欢数据库中主键和外键的通用名称或强类型名称?

时间:2009-07-14 18:55:52

标签: database-design

假设我在父子关系中有两个表。我们称之为“网站”和“建筑物”,其中“网站”是一个或多个“建筑物”的父母。我希望ID在数据库中是唯一的,因此我将使用GUID作为ID。

我是否更喜欢表格中ID字段的通用名称或强类型名称?为什么?

示例1(通用名称):

CREATE TABLE sites (
   id VARCHAR(38) NOT NULL,
   -- other attributes
);

CREATE TABLE buildings (
   id VARCHAR(38) NOT NULL,
   parent_id VARCHAR(38) NOT NULL,
   -- other attributes
);

示例2(强类型名称):

CREATE TABLE sites (
   site_guid VARCHAR(38) NOT NULL,
   -- other attributes
);

CREATE TABLE buildings (
   building_guid VARCHAR(38) NOT NULL,
   site_guid VARCHAR(38) NOT NULL,
   -- other attributes
);

4 个答案:

答案 0 :(得分:4)

我更喜欢简单的id,因为这是标准约定,这里是所有数据库命名约定的绝佳链接:http://weblogs.asp.net/jamauss/pages/DatabaseNamingConventions.aspx#Columns

  

“规则2a(标识主键字段) - 对于作为表的主键并唯一标识表中每条记录的字段,名称应该只是”Id“,因为它就是这样 - 标识字段这个名字也更贴近你的类库中的“Id”属性名称。这个名字的另一个好处是,对于连接,你会看到像         “客户在Customer.Id = Orders.CustomerId上加入订单”   这使您可以在Customer表后再次避免使用“Customer”一词。“

答案 1 :(得分:3)

我更喜欢使用building_id,site_id,以便列名更明确地定义其内容而不仅仅是“id”。这也可以使用ANSI连接“使用”语法:

select site.site_id, building.building_id
from building
join site using (site_id);

另一个优点是,当在查询(或视图或子查询)中使用这些列时,它们不需要经常重新别名 - 如下所示:

select site.id as site_id, building.id as building_id
from building
join site on site.id = building.site_id;

答案 2 :(得分:1)

一种惯例是在建筑物表格中使用“building_”前缀所有字段,因此您将拥有“building_id”,“building_name”等。外键,例如“site_id” “,保留原来的名字,让它完全清楚发生了什么。

修改

我应该提一下,我选择“_id”而不是“_uid”或“_guid”,因为只有一个ID字段,所以我没有理由强调其数据类型。

答案 3 :(得分:1)

这主要是品味问题。项目应该有一些一致性。最重要的是:

  • 您可以记住重复列的名称,您不需要查看表定义来键入简单的SQL查询
  • 您不需要查看代码或文档来粗略地理解列的含义

就个人而言,我更喜欢整个项目中具有相同名称的ID。编写通用代码也更容易,它独立于特定的表。

对于外键我通常使用<ForeignTable>_FK模式。如果同一个表中有多个外键,我会像往常一样在面向对象设计<Role>_FK中使用角色名称,例如CurrentUser_FK