2

我正在开发一个大数据库,从这种情况下,我决定至少在决定表和字段布局时总是三思而后行。我最关心的是主键。

我几乎总是使用table name加号_id来命名这些索引。我这样做是因为在加入表格时我不必担心重复的字段名称,因为Delphi数据库组件给我们的字段table_name.field_name只是字段。

另一方面,如果我们可以为每个表使用相同的 ID 字段名称,那么创建一个函数来处理与该索引控件相关的每个表总是更容易。

有没有人在选择其中一种数据库设计时有过不好的经历?在每个字段名称上重复表名称是一种好方法吗?

4

4 回答 4

22

我过去设计了许多数据库,并且多次犯了不一致命名表和列的错误。我知道其他人有不同的意见,但这些是我现在遵循的规则:

  1. 表名是复数 我觉得有一个products表而不是一个product表是很自然的,尤其是当涉及到选择语法时:SELECT whatever FROM products感觉比SELECT whatever FROM product. 最后,你选择单数还是复数都没有关系,只要你不混合它们。

  2. 字段名称是单数的 同样,这或多或少是一个随意的选择,但对我来说似乎很自然,并且是大多数人使用的。(你可以说这SELECT descriptions FROM products更有意义,但是嘿,你不能争论什么)

  3. 所有名称都是小写并使用下划线分隔单词 有些人使用 Pascal 风格的大写,例如ProductId甚至 JavaScript 风格productId。过去我亲自使用过许多不同的数据库引擎,老实说,我懒得记住哪些是区分大小写的,哪些不是。table_name似乎被普遍接受,我从来没有遇到过任何问题。由于您专门为 Delphi 应用程序设计数据库,因此您可能希望选择 Pascal 样式,以便源代码不会混合不同的样式。我个人只是坚持field_name. (顺便说一句:即使某些数据库允许在标识符中使用特殊字符,但我尽量避免它们像瘟疫一样,对于可能是数据库关键字的列名也是如此。即使我为表制造商设计了一个数据库,我也会永远不要将产品表命名为“表”)

  4. 主键和外键包括表 名表products得到一个product_id主键。无论其他表链接到该表,都会获得product_id外键。这会自动记录数据库设计的一部分,并允许使用自然连接。我过去确实设计了一个数据库,其中每个表都有一个标有“id”的主键。这确实很快变得非常混乱。

  5. 其他列的表名没有前缀 这可能是这个列表上的规则,我每隔一段时间就会打破一次,但首先要做的是。根据这条规则,产品的描述将进入一个description字段,而不是进入product_description. 造成这种情况的主要原因是代码中的混乱程度较低。查询变得更短并且更易于阅读。SELECT product_id, description, price FROM products WHERE price>1 AND price<9比 . 更容易阅读SELECT product_id, product_description, product_price FROM products WHERE product_price>1 AND product_price<9。两个查询都会做同样的事情,但一个比另一个跨越更多的代码行。我有时会打破这条规则有三个原因:

    一个。对于主键。请参阅#4 - 能够查看哪些列是不杂乱的主键,但重要到足以每次都写下来。

    湾。当两种完全不同的值类型共享相同的标识符时:人名与产品名称完全不同。在开发的某些阶段,它可以让事情更容易区分 aperson_name和 aproduct_name而无需交出大量元数据。(或者,就此而言,在 person'sname和 product's之间brand_name,这消除了对表前缀的需要。)

    C。如果两个表都包含相同的字段名称,则很可能在查询中经常被连接。如果你有一个产品description和一个订单description,你可能不得不重命名查询的列很多,这可能会很混乱。

同样,以上所有都是个人喜好。你的旅费可能会改变。唯一似乎得到普遍认同的是:选择一种风格并坚持下去

PS我可能没有回答你的部分问题,但是“......创建一个函数来处理与该索引控件有关的每个表总是更容易。” 对我来说毫无意义。

于 2013-06-15T22:16:40.357 回答
2

我认为这主要是个人喜好和你喜欢打字的次数和时间。键入所有字段名称,table_name.field_name以便您可以SELECT *join语句中执行,而不必在重复字段名称上使用表名进行预限定,这似乎需要预先输入很多字段,因为有时可能需要对字段进行预限定,如果大多数情况下您的选择语句包括字段名称,然后table_name.field_name只需要输入字段似乎需要大量输入。

我确信添加更长的字段名具有微不足道的性能问题,并且可能只有当架构信息通过 ODBC 网络传输但仍然不是真正的问题时才真正引人注目。

我不了解Delphi,但在.NET中,您也可以按位置查找字段名称,或者通过访问标记为主键字段的字段,所以我不确定一个函数参数是否适用于要求表具有相同的 ID 字段名称。

我一直保留我的主键字段,只是在我的表中调用,并且没有在字段名称声明中包含表名,除了必须跨多个表对字段选择语句UID进行预限定之外,我从来没有遇到过问题。UID尽管我可以看到包含tablename.UIDfor 键字段的一些好处,因为SELECT *跨多个表的许多语句不会出现重复字段错误,除非其他表中有重复数据(我希望不会)。

于 2013-06-15T13:08:10.903 回答
1

要考虑的另一件事是数据库建模。ERwin、Visio 等工具会自动将父 PRIMARY KEY 向下迁移关系,因此如果该字段在父表中具有前缀,则无需在子表中重命名1。由于没有重命名,也没有任何人忘记重命名的危险,因此只需查看字段名称,您就可以自信地看到它的来源,而无需直观地跟踪字段来源的关系。当存在多个级别的关系并使 ER 图更具可读性时,这一点尤其重要,IMO。

它还使 SQL 对我来说更清晰,因为我的大脑不需要“解析”别名来确定哪个字段来自哪里,并使NATURAL连接的危险性降低2,但其他人可能对此有不同的看法。 ..


1如果您使用parent.idand child.id,那么您必须将迁移的密钥重新命名为类似的东西child.parent_id以避免命名冲突。但是,如果您使用parent.parent_idand child.child_id,则无需执行任何操作 - 迁移的密钥会自动命名为child.parent_id. 链条继续grandchild.grandchild_id等......

2老实说,如果你能提供帮助,你永远不应该做 NATURAL - 始终明确指定你的加入标准。

于 2013-06-15T23:28:39.553 回答
0

在 delphi 中,您也可以使用别名来解决重复名称字段的问题。

看:

SELECT table1.fieldX AS 'myDesiredName', table2.fieldX AS 'myDesidedName2' FROM ...

这解决了ClientdataSetso 对象查询中重复名称的问题。您的 Delphi 应用程序使用您提供的名称myDesiredName

于 2013-06-15T22:50:05.973 回答