Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在不同表中使用相同字段名(特别是ID)时出现的问题_Database_Delphi_Database Design_Indexing - Fatal编程技术网

Database 在不同表中使用相同字段名(特别是ID)时出现的问题

Database 在不同表中使用相同字段名(特别是ID)时出现的问题,database,delphi,database-design,indexing,Database,Delphi,Database Design,Indexing,我正在开发一个大数据库,在这种情况下,我决定至少在决定表和字段布局时要三思而后行。我最关心的是主键 我几乎总是使用表名加\u id来命名这些索引。我这样做是因为在连接表时,我不必担心重复的字段名,因为Delphi数据库组件将字段作为table\u name.field\u name提供给我们,而只提供字段 另一方面,如果每个表都有相同的ID字段名,那么创建一个函数来处理与该索引控件相关的每个表总是比较容易的 有没有人在选择这些数据库设计时有过不好的经历?在每个字段名上重复表名是一种好方法吗?我认

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

我几乎总是使用
表名
\u id
来命名这些索引。我这样做是因为在连接表时,我不必担心重复的字段名,因为Delphi数据库组件将字段作为
table\u name.field\u name
提供给我们,而只提供字段

另一方面,如果每个表都有相同的ID字段名,那么创建一个函数来处理与该索引控件相关的每个表总是比较容易的


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

我认为这主要是个人喜好和您喜欢的输入量以及输入时间。将所有字段名键入为
table\u name.field\u name
,这样您就可以在
join
语句中执行
SELECT*
,而不必在重复的字段名上使用表名进行预限定,这看起来像是在字段可能需要预限定的几次之前进行了大量键入,如果您的大多数SELECT语句包括字段名,然后必须键入
table\u name.field\u name
,因为仅此字段似乎需要大量键入

我确信,添加更长的字段名会带来无关紧要的性能问题,并且可能只有在通过ODBC网络传输模式信息时才真正值得注意,但这仍然不是真正的问题

我不知道关于Delphi,但在.NET中,您也可以通过位置或访问标记为主键字段的字段来查找字段名,因此我不确定单函数参数是否有效,是否要求表具有相同的ID字段名


我一直在我的表中保留主键字段,只调用了
UID
,在字段名声明中没有包含表名,而且除了在多个表中预先限定
UID
fields select语句之外,我从未遇到过其他问题。虽然我可以看到在关键字段中包含
tablename.UID
有一些好处,因为跨多个表的许多
SELECT*
语句不会有重复的字段错误,除非其他表中有重复的数据(我希望不会有重复的数据)。

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

  • 表名是复数的 我觉得有一个
    products
    表而不是
    product
    表是很自然的,特别是在选择语法时:
    从products中选择which
    从product中选择which
    感觉更好。最后,你选择单数还是复数并不重要,只要你不把它们混在一起

  • 字段名是单数的 同样,这或多或少是一个武断的选择,但对我来说似乎很自然,也是大多数人使用的。(你可以争辩说,
    从产品中选择描述
    更有意义,但嘿,你不能争辩什么)

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

  • 主键和外键包括表名
    products
    表获取一个
    product\u id
    主键。任何其他链接到该表的表都会获得一个
    product\u id
    外键。这将自动记录数据库设计的一部分,并允许使用自然连接。我曾经设计过一个数据库,每个表都有一个标记为“id”的主键。很快就弄得一团糟了

  • 其他列的表名没有前缀
    这可能是这个列表上的规则,我偶尔会打破一次,但首先要做的是。根据此规则,产品描述将进入
    描述
    字段,而不是
    产品描述
    。这样做的主要原因是代码中的混乱更少。查询变得更短,更容易阅读<代码>从price>1和price1以及product\u price的产品中选择product\u id、description、price。在delphi中,您也可以使用别名来解决名称字段重复的问题

    见:

    这解决了
    clientdataset
    o对象查询中重复名称的问题。
    你的Delphi应用程序与你在代码中给出的名字一起工作。诸如ERwin、Visio等工具会自动将父主键向下迁移到关系中,因此,如果父表中的字段带有前缀,则不需要在child1中重命名它。既然没有仁
    SELECT table1.fieldX AS 'myDesiredName', table2.fieldX AS 'myDesidedName2' FROM ...