适用于多对多交叉表的表命名约定

时间:2010-02-05 15:18:10

标签: database-design

我有很多关系:客户端和代理表(只是一个例子)。显然,每个客户端可以有多个代理,每个代理可以有多个客户端。什么被认为是交叉表的正确命名约定....是ClientBroker ......?

7 个答案:

答案 0 :(得分:37)

我更喜欢“Clients_Brokers”(将两个名称复数化以表示多对多)。

答案 1 :(得分:16)

我更喜欢区分交叉表和实际的事务表。 所以,我用Map结束它们。所以它将是Client_Broker_Map或ClientBrokerMap。

答案 2 :(得分:11)

我通常使用两个连接表的名称。

所以,在你的情况下,ClientBroker。

答案 3 :(得分:8)

我经常看到“Client_Broker”格式

答案 4 :(得分:6)

一些程序员不喜欢将表名多元化,原因如下:

  • 它打破了“是一个”规则,这意味着如果你有一个名为'User'的表,那么表中的每个记录“都是一个”User对象。这遵循面向对象的规则。
  • Model类通常以其数据来源的表命名。因此,如果您有用户模型,则模型所代表的记录位于用户表

如果您掌控项目的整个数据库和业务层,这将非常有意义。但是,许多框架现在都有ORM库,可以帮助处理表和关系。那些ORM库通常都有一个命名语法,应该遵循它让ORM库完成大部分繁重工作。

例如,我使用PHP的Kohana MVC框架,它提供了一个ORM库。 ORM建议使用所有小写名称复数表名,并使用下划线表示多对多表名。因此,对于您的示例,您将拥有以下表:clients,brokers和brokers_clients(ORM建议按字母顺序排列多对多表的表名)。在为这些表创建模型(扩展ORM模型)时,使用表名的单数值,因此客户端的模型将是Client。 ORM处理复数转换。 Kohana的ORM也使用了一个变形库,因此可以正确处理不寻常的复数值。例如,名为“categories”的表可以使用模型名称“Category”。最后,如果您已经实现了db结构但想要使用ORM库,则可以覆盖默认的ORM表命名语法并为其指定要使用的表名。

答案 5 :(得分:5)

我正处于一个项目的中间,我正在使用DESCRIBE获取表和字段名称。我使用Client_x_Broker所以我可以很容易地找到一个表并使用_x_作为标准来获取字段,这个字符串在代码或数据集中不会自然发生,而且无论如何都不在我的中,并且是很容易找出单个表的名称。此外,只要我保持一致,我就可以从包括主键名称的表名中获得大量信息。对不起,迟到了,b,继续。 :)

答案 6 :(得分:0)

对于休眠用户,根据日志消息并分析生成的查询,通过反复试验发现了未记录的规则:

enter image description here

对这张图片进行形式化处理,您需要使用一个名为:table1_table2的链接表,并在链接表中使用以下ID:table1_table1Id和table2_table2Id

这样做,Hibernate无需进一步说明就可以了解发生了什么,并提供了@JoinTable信息。

@Data
@Entity
@Table(name="course")
public class Course {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long courseId;

    @Column(name="name")
    private String name;
}

@Data
@Entity
@Table(name="student")
public class Student {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long studentId;

    @Column(name="name")
    private String name;

    @Column(name="class")
    private String className;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Course> course;
}

如果您坚持使用此映射,那么所有JPQL查询都可以正常运行,并且可以按预期生成具有外部联接的正确SQL查询...注意,在 course 中没有 -s 结束!无论如何,如果您要课程 s ,则应将联接表中的字段名称更改为table2 s _table2Id,并将表本身更改为table2 s

PS 在JPA和Hibernate文档中(仅在单个example中)我都没有发现关于此约定的任何简单提及,并且可能会在以后的版本中进行更改,使用Hibernate 5.2 / 5.3进行了测试。但是,它提示了如何命名其中的连接表和字段。