3

我在子系统中有一个Person类。Contacts另一方面,在 CRM 子系统中,我有Customer.

在数据库设计中,我想在这些概念之间建立一种关系。有一些可能的方法:

  1. 每个客户都是一个人,因此客户应该从人继承,一旦他的人被移除,客户就会死去(组合)。在这种情况下,我们在表和表的列之间创建了one-to-one关系,并且我们将表的列作为标识字段,但是我们在表中显式插入了。IdCustomersPeopleIdPeoplescope_identity()Customers
  2. 每个客户都有一个人,因此客户和个人都有自己的生命周期(聚合),并且可以在没有对方的情况下生存。在这种情况下,Customers表应该有一个表的外键People。这里的坏点是每个人都Person可以有很多Customers这对我来说似乎很奇怪。

哪种设计被推荐为最佳实践?我需要可靠的客观答案。谢谢你。

4

2 回答 2

1

IHMO,每个实体都必须有一个正确的 ID。您写外键来将 Person 称为 Customer,但这是另一个概念。

如果 Person 是关于 Customer 的基类,那么 ID 字段是相同的,并且您在 Customer 类中不需要显式,因为它是由 Person 继承的。

在第一种情况下(FK 的人员和客户),您有:

class Person {
    private String id;
    ... and so on
    ... put here get and set property (as getId() / setId() and so on) 
}

class Customer {
    private String id; // this is different by id of Person class
    private Person person;
    ... and so on
    ... put here get and set property (as getId() / setId() and so on) 
}

在第二种情况下(客户扩展人),您有:

class Person {
    private String id;
    ... and so on
    ... put here get and set property (as getId() / setId() and so on) 
}

class Customer extends Person {
    ... other properties about Customer
    ... put here get and set property
}
于 2013-09-04T08:09:28.863 回答
1

在不同的情况下,您可能会或可能不会为每个表提供其自己的 ID。

在您的情况下,如果客户表确实有自己的 ID,那就更好了。

示例:多对多关系定义表中的自己的 Id 是多余的,当它除了要连接的表之外没有任何额外的列关联时。考虑一个TeacherStudent表的关系。他们有一个多对多的关系。如果有一个表名TeacherStudentRelation只有外键TeacherStudent表,那么它不需要任何额外的OwnId字段。

但在你的情况下,一个Customer表肯定会有额外的信息,比如balancepurchaseList或者类似的东西。您很可能会在Customer表格中搜索某些数据。这里的OwnId客户表可以让您索引该表。

简而言之,请给Customer表提供它自己的 ID。

于 2013-09-04T08:14:22.463 回答