Database design 多对多相交表的正确表命名约定

Database design 多对多相交表的正确表命名约定,database-design,Database Design,我有一个多对多关系:客户机和代理表(只是一个示例)。显然,每个客户机可以有多个代理,每个代理可以有多个客户机。intersect表的正确命名约定是什么。。。。是ClientBroker…?我通常使用两个连接表的名称 因此,在您的情况下,ClientBroker。我经常看到“Client\u Broker”的格式。我更喜欢“Clients\u Broker”(两个名称的复数表示多对多)。我更喜欢区分相交表和实际的事务表。 所以,我用地图来结束它们。所以它应该是Client\u Broker\u M

我有一个多对多关系:客户机和代理表(只是一个示例)。显然,每个客户机可以有多个代理,每个代理可以有多个客户机。intersect表的正确命名约定是什么。。。。是ClientBroker…?

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


因此,在您的情况下,ClientBroker。

我经常看到“Client\u Broker”的格式。

我更喜欢“Clients\u Broker”(两个名称的复数表示多对多)。

我更喜欢区分相交表和实际的事务表。
所以,我用地图来结束它们。所以它应该是Client\u Broker\u Map,或者ClientBrokerMap

一些程序员不喜欢表名的复数形式,原因如下:

  • 它打破了“is a”规则,这意味着如果有一个名为“User”的表,那么表中的每个记录都是“User”对象。这遵循对象定向规则
  • 模型类通常以其数据来源的表命名。因此,如果您有一个用户模型,则该模型表示的记录位于用户表中
如果您控制项目的整个数据库和业务层,这将非常有意义。然而,现在很多框架都有ORM库,可以方便地处理表和关系。这些ORM库通常有一个命名语法,应该遵循该语法,以让ORM库完成大部分繁重的工作


例如,我使用Kohana MVC framework For PHP,它提供了一个ORM库。ORM建议将表名复数化,使用所有小写名称,并对多对多表名使用下划线。因此,对于您的示例,您有以下表格:clients、brokers和brokers\u clients(ORM建议按字母顺序排列多对多表的表名)。为这些表创建模型(扩展ORM模型)时,使用表名的单数值,因此客户端的模型将是Client。ORM处理多元化转换。Kohana的ORM还使用了一个屈折函数库,因此可以正确处理不寻常的复数值。例如,名为“categories”的表可以使用模型名“Category”。最后,如果你已经实现了一个DB结构,但是想要使用ORM库,你可以重写默认的ORM表命名语法,并给它一个你想使用的表名。

< P>我正处于一个项目中,在这里我使用Spice获取表和字段名。我会使用Client_x_Broker,这样我就可以很容易地找到一个表并通过使用
\u x_
作为标准来获取字段,这是一个字符串,通常不会在代码或数据集中自然出现,也不会在我的数据库中出现,而且很容易找到单个表的名称。此外,只要我保持一致,我就可以从表名(包括主键名)中获取大量信息。对不起,a迟到了,b在继续。:)

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

将此图片形式化后,您需要使用名为table1\u table2的链接表,并在链接表中使用ID,例如table1\u table1Id和table2\u 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;
}
@数据
@实体
@表(name=“course”)
公共课{
@身份证
@GeneratedValue(策略=GenerationType.AUTO,generator=“native”)
@GenericGenerator(name=“native”,strategy=“native”)
私人长假;
@列(name=“name”)
私有字符串名称;
}
@资料
@实体
@表(name=“student”)
公立班学生{
@身份证
@GeneratedValue(策略=GenerationType.AUTO,generator=“native”)
@GenericGenerator(name=“native”,strategy=“native”)
私立长期学生;
@列(name=“name”)
私有字符串名称;
@列(name=“class”)
私有字符串类名;
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
私人列表课程;
}
如果您坚持这种映射,所有JPQL查询都会顺利工作,并按照预期使用外部联接生成正确的SQL查询。。。注意,课程结束时没有-s!如果您希望课程s无论如何,您应该将连接表中的字段名称更改为table2s\u table2Id,并将表本身更改为table2s


p.S.我在JPA和Hibernate文档中都没有发现任何直接提及此约定的内容(仅在单个文档中),并且它可能会在将来的版本中进行更改,使用Hibernate 5.2/5.3进行测试。不过,它给出了如何命名联接表及其字段的提示。

我对此投了赞成票,因为有人投了反对票。我认为这个惯例很好,而且经常是必要的。MVC框架提供的一些ORM库具有自动处理关系的表命名约定。我知道至少有3个PHP框架对多对多数据透视表名称使用复数名称和下划线分隔。这是旧的单数与复数表命名冲突(扩展到联接表)。您是否以单数形式命名一个表,例如“Customer”,因为每个记录代表一个客户?还是复数,因为表本身包含许多“客户”?这是一个意见问题,我不认为有理由对此投反对票。+1:标点符号应该谨慎使用,在这种情况下,它有助于区分双方。我可能会同意这一点。同时考虑表名和模型名<代码>客户经纪人型号?可能没那么糟。当你实例化它的时候<代码>客户与经纪人?复数形式是什么
ClientBrokerMap
稍好一些。但如果你问我的话,更好的是
ClientBrokerRelationship
。而
ClientXBroker
是一个