database-design - 数据库, 表和列名称转换?

  显示原文与译文双语对照的内容

每当设计数据库时,总是想知道是否有最好的方法来命名数据库中的项目。 我经常问自己以下问题:

  1. 表名应该是复数?
  2. 列名是否应为单数?
  3. 应将表格或列插入?
  4. 在命名项目中是否使用任何大小写?

对于数据库中的项目命名,是否有建议的指南?

时间:

我建议签出 SQL Server 示例数据库的: http://codeplex.com/SqlServerSamples

AdventureWorks示例使用了一个非常清晰且一致的命名约定,它使用了数据库对象的架构名称。

  1. 表格的单数名称
  2. 列的单数名称
  3. 表前缀的架构名称( 例如: SchemeName.TableName )
  4. Pascal大小写

在这里回答,但简而言之:

  1. 我的偏好是复数
  2. 是的
  3. 表 : *Usually* 没有前缀是最好的。 :No 。
  4. 两个表和列:Pascal套管。

细化:

( 1 ) 你该做的事。 并没有多少东西你必须做所谓的某些方式,每次都有,只是有些。

  • 使用"[singularOfTableName] 标识"format,命名你主键. 也就是,你是否表的名字叫客户或者客户,主键应该客户 id 。
  • 在不同tables,进一步,外键必须一致地被命名为. 击败不这样做的人是合法的。 我也以为当定义外键约束经常是重要的。一致的外键命名都不能总是重要
  • 你的数据库必须有磅的内部约定 。 即使在后面的章节你会看到我是非常灵活的,数据库命名中的必须是非常一致的。 为客户的名称比这 客户或者客户 不是很重要你是否你的表相同的方式完成这里在整个同一数据库中。 以相同的方式使用它们,和你可以掷一个硬币来决定如何使用下划线,但然后你必须保留下一部分 如果你不这么做,你是一个bad自尊的人。

( 2 ) 你可能应该做什么。

  • 在不同表中代表相同类型数据的字段应该是相同的。 一个表没有 Zip,而邮政编码在另一个表上。
  • 要在表格或者列名中分隔单词,请使用 PascalCasing 。 使用camelCasing不会有本质问题,但这不是惯例,它看起来很有趣。 我将在几分钟内显示下划线。 ( 你不能像过去那样使用 ALLCAPS 。 OBNOXIOUSTABLE.ANNOYING_COLUMN 在 20年前可以正常运行,但现在没有。
  • 不要缩短或者缩短单词。 一个名字比短的和混乱的名字长,清晰。 Ultra-short名称是较暗的,更野蛮的时间的一个延续。 Cus_AddRef,地球上是什么? 保管收件人参考客户额外退款? 自定义地址引用?

( 3 ) 时应该考虑的问题。

  • 我真的认为你应该对表格有复数的名字;有些人认为是单数。 在其他地方读取参数。列名应该是单数。 即使你使用了复数表名,代表其他表组合的表也可能是单数。 例如如果你有一个促销和一个表,一个表示一个项目必须显式地预订一个推广可能是 Promotions_Items 项,但它也可以合法地Promotion_Items我认为( 反映one-to-many关系) 。
  • 一致地使用下划线和特定用途。 一般的表格名称应该足够清晰,使用 PascalCasing ;不需要下划线来分隔单词。 保存下划线( ( 一个) ) 以指示关联表或者( b ),用于前缀,这将在下一个项目符号中显示。
  • 前缀既不好也不坏。 但是它通常 并不是最好的。 在你的第一个或者两个数据库中,我不建议使用前缀作为表格的常规主题分组。 最终导致不能拟合你的类别方便的拼接,并且它能真正使它难来查找表。 有了经验,你可以计划并应用一个比伤害更好的前缀方案。 一次我在一个采用db数据表开始的地方与任务型学习与 。config表 ctbl 。视图与 vew 。proc sp ,以及之要点作 fn,和一些其他的,它是精心制作的,一致地使用,使它的运行得好吧。 只是因为某些特殊原因,是当你真正独立的解决方案时才需要你前缀驻留在同一个db2实例中;加上前缀会变得非常有帮助分组的表。 对于特殊情况,也可以使用前缀,比如你想突出显示的临时表。
  • ( 如果曾经) 很少要对列进行前缀。

好吧,因为我们在权衡:

我认为表名应该是复数。 表是实体的集合( 表格) 。 每行代表一个实体,该表代表集合。 所以我会把人的表格叫做( 不管你喜欢什么人) 。

对于那些希望在查询中看到单数"实体名称"的人,我将使用表别名:


SELECT person.Name
FROM People person

有点像"从人的linq中选择 person.name"。

对于 2,3和 4,我同意 @Lars.

我在一个有三个dba的数据库支持团队工作,我们考虑的选项是:

  1. 任何命名标准都比没有标准好。
  2. 没有"一个真"标准,我们都有自己的偏好
  3. 如果已经存在标准,请使用它。 不要创建另一个标准或者泥泞的现有标准。

我们为表格使用单数名称。 表的前缀往往是系统( 或者它的首字母缩写)的名称。 如果系统复杂,因为你可以更改前缀以逻辑地将表组合到一起( IE 。 reg_customer,reg_booking和 regadmin_limits ) 。

对于字段,我们期望字段名包含表的前缀/acryonm ( 例如 。 cust_address1 ) 和我们更喜欢使用一组标准后缀( 用于PK的_id,_cd"代码",_nm为"名称",_nb为"号码",_dt为"日期") 。

Foriegn字段的名称应与主键字段相同。

等等


SELECT cust_nm, cust_add1, booking_dt
FROM reg_customer
INNER JOIN reg_booking
ON reg_customer.cust_id = reg_booking.cust_id

在开发新项目时,我建议你写出所有首选实体名称,前缀和首字母缩写,并将这里文档交给你的开发人员。 然后,当他们决定创建一个新的表格时,他们可以引用文档,而不是"猜测",而不是表格和字段。

  1. 否。一个表应该以它所代表的实体命名。 人,而不是人,是指任何一个记录代表的人。
  2. 同样,同样的事情。列名真正不应该叫做 FirstNames 。 这完全取决于你想用列表示什么。
  3. 没有
  4. 是的为了清楚起见。 如果你需要有像"名字名"这样的列,那么大小写将更容易阅读。

    好的,那是我的$0.02

我也赞成 ISO/IEC 11179风格的命名惯例,注意它们是指导原则而不是规范。

在维基百科中查看数据元素名称:

"表是实体的集合,并遵循集合命名原则。 理想情况下,使用一个集体名称: 职员。复数也是正确的: 雇员。不正确的名称包括:雇员,tblEmployee和 EmployeeTable 。"

往常一样,规则 比如 有例外:总是只有一行的表可以更好地使用单数名称 比如 和一个配置表。 一致性是最重要的: 检查你商店有一个约定,如果是,是否按照它;如果你不喜欢它就做一个商业案例来将他们替换而不是被孤独的巡警。

查看 ISO 11179 -5: 你可以在这里获得命名和识别原则: http://metadata-standards.org/11179/#11179-5

我在这里写了一段博客: ISO-11179命名约定

#3 上关于这些列names,添加前缀,我知道这是到游戏后期,并且该问题已经回答得很好了已经,但我想提供我的opinion.

在圈,所有列应该有名称,将前缀,它是唯一到表中它们被定义

E.g 。给定表"客户"和"地址",让我们分别使用"客户"和"地址地址"的前缀。 "客户"将有"cust_id","cust_name",等等 中的。 "地址"将有"addr_id","addr_cust_id"( FK回到客户),"addr_street",等等 。

当我第一次使用这个标准时,我反对它;我讨厌这样的想法。 我无法忍受所有额外的打字和冗余的想法。 现在我已经有了足够的经验,我不会再回头了。

这样做的结果是数据库架构中的所有列都是唯一的。 这里有一个主要的好处,它胜过所有反对它的参数( 在我看来,当然):

你可以搜索整个代码库和可靠地找到某个特定列的每一行代码都接触到。

#1的好处是巨大的巨大。 之前先在schema,我可以取缔一种列和确切地知道哪些文件需要更新的列可以安全地取掉。 我可以改变一列的含义,并确切知道需要重构哪些代码。 或者我可以简单地判断一个列的数据是否在系统的某个特定部分被使用。 在开发中我work,的次数都数不清这转了个潜在的巨大投影到一个简单的一,也不是量的小时我们已经保存。

另一个,它是,你只需要使用相对较少的利于table-aliases当你做一个自我联接:


SELECT cust_id, cust_name, addr_street, addr_city, addr_state
 FROM customer
 INNER JOIN address ON addr_cust_id = cust_id
 WHERE cust_name LIKE 'J%';

我对这些的意见是:

1 ) 否,表名应该是单数。

虽然对于简单选择来说似乎有意义 select * from Orders 它对面向对象的等价( Orders x = new Orders ) 。

数据库中的表实际上是那个实体的集合,一旦使用 set-logic,它就更有意义了:


select Orders.*
from Orders inner join Products
 on Orders.Key = Products.Key

最后一行,连接的实际逻辑,与复数的表名看起来很混乱。

我不确定是否总是使用别名( 就像Matt建议的那样) 清除。

2 ) 它们应该是单数,因为它们只保留 1个属性

3 ) 永远不会如果列名不明确( 上面都有一个叫做 [Key]的列)的表的名称( 或者它的别名) 能区分注释得足够 你希望查询快速类型和简单- 前缀添加不必要的复杂性。

4 ) 无论你想要什么,我都建议 CapitalCase

我不认为有一套绝对准则。

只要你选择的东西在整个应用程序或者数据库中都是一致的,我认为它并不重要。

我们的偏好:

  1. 表名应该是复数?
    从不。它作为集合的参数是有意义的,但你不知道表将包含( 0,1或者多个项目) 。 复数规则使得命名不必要复杂。 1家,2家,鼠标 vs 鼠标,人 vs,我们还没有看过任何其他语言。

    Update person set property = 'value' 对表格中的每个人执行操作。
    Select * from person where person.name = 'Greg' 返回人员行的集合/行集。

  2. 列名是否应为单数?
    通常,是的,除非你正在破坏规范化规则。

  3. 应将表格或列插入?
    大多数是平台首选项。我们更喜欢使用表名称的前缀。 我们不对表进行前缀,但我们使用前缀视图( vpg ) 和 stored_procedures ( sp_或者 f_ ( 函数) 。 这可以帮助想尝试 upday v_person.age的人,它实际上是视图( 无法更新的内容) 中的一个计算字段。

    这也是避免关键字冲突( delivery.from 中断,但delivery_from没有)的好方法。

    它使得代码更加冗长,但通常有助于可读性。

    bob = new person()
    bob.person_name = 'Bob'
    bob.person_dob = '1958-12-21'
    非常易读和清晰。 但这可能会失控:

    customer.customer_customer_type_id

    表示客户和customer_type表之间的关系,表示customer_type表( customer_type_id ) 上的主键,如果你在调试查询时看到'customer_customer_type_id',则立即知道它来自( 客户表) 。

    还有你有一个M-M哪儿customer_type之间关系和 customer_category ( 只有几种可以用于某些类别)

    customer_category_customer_type_id

    。在长边上有一个小( ) 。

  4. 在命名项目中是否使用任何大小写? 是- 小写:),带下划线。 这些是非常易读和跨平台的。 在上面加上 3也有意义。

    大多数是偏好设置。 - 只要你是一致的,任何人都可以预知它。

...