SQL表架构问题

时间:2011-07-22 06:19:09

标签: mysql schema

我最近开始将表格的名称附加到表格中的所有列中。所以说我有这些表:

Companies:

Id | Name | Logo | Info


Companies Employees:

Company Id | Employees Id


Employees:

Id | Name

我会将列名更改为:

Companies:

Company Id | Company Name | Company Logo | Company Info


Companies Employees:

Company Id | Employee Id


Employees:

Employee Id | Employee Name

这允许我使用SELECT * FROM `Companies` NATURAL JOIN `Companies Employees` NATURAL JOIN `Employees`之类的查询,而无需担心重命名IdName列,因为我保证不会有同名的列是my { {1}}和Companies表。但我想知道这是不是好的架构设计实践?如果有充分的理由反对它,我不想养成它的习惯,但除了大量冗余重新输入表名之外,我还没有想到其他任何东西。

4 个答案:

答案 0 :(得分:1)

一个帖子中有两个不良做法。

1。不要这样做,它既不会增加功能,也不会增加可读性。您需要使用表名前缀的唯一位置是关系表。

2。不要使用NATURAL JOIN

答案 1 :(得分:0)

为什么写Companies.NameEmployee.Id这么难?我认为浪费你的时间。

答案 2 :(得分:0)

在几个不同的情况下,将表的名称添加到每列可能会有所帮助 -

  • 当您加入2个表,否则这些表将共享多个列名称时,它将使您不必分配别名来区分列

  • 我倾向于在整个Web应用程序中使用数据库列名来保持一致性;我将列名称保存在表单字段,变量等中,它们处理相同的数据项。在包含100多个表的大型数据库中,它可以帮助我保持井井有条,并在变量上加上表名前缀。更不用说,它可以帮助那些对项目不熟悉的人,如果他们能看到变量来自哪个表。

  • 当您在表中指定外键时,如果您有一个命名约定来指定该键所属的表,则会有很大帮助。没有什么比看到外键并且不知道它应该属于哪个表更糟糕了。

使用表名为列添加前缀的唯一缺点是它可能会有点冗长。

答案 3 :(得分:0)

在没有明确命名键列的情况下连接表对于简单查询非常有用,但是当您需要连接三个或更多表时,往往会搞乱。每次我尝试用ON替换USING()子句时,我都发现了这个问题。

例如:假设您想要按城市获取销售报告。您可以考虑办公室城市或客户城市。表customeroffice都有一个city_id外键指向city表,但是当您查询客户时,NATURAL JOIN无法知道您要加入哪一个和办公室在同一个查询中。

无论如何,单独使用唯一列是一个很好的技巧。它为您节省了大量SELECT foo.id AS foo_id...