这是一个概念性的例子,我正在寻找最佳的实施解决方案。
我有3张表如下:
TABLE_A
-------
SIREN
NDA
TABLE_B
-------
SIREN
NDA
TABLE_C
-------
SIREN
NDA
这3对表具有相同的SIREN / NDA,这对夫妇是唯一的,我必须在使用它的表之间导航。
创建此实体的最佳做法是什么?使用SIREN / NDA作为COMPOSITE KEY
对象还是应该创建技术PK ID?
答案 0 :(得分:0)
是。如果SIREN / NDA属性对是唯一的,则应该使该对成为复合主键。您给出的示例有三个具有相同属性集的表。在某些情况下,我们会获得这些类型的表,尤其是在数据库模式中的Representing Class Hierarchies中。根据相关实体之间的不相交和完整性,有两种常规方法。
不相交 - 子类没有共同的实体
重叠 - 子类至少有一个共同的实体
完整 - 超类的所有实体至少属于其中一个 子类。也称为覆盖。
部分 - 超类中至少有一个实体没有 属于任何一个子类。
例如,假设以下具有属性的实体。主键是粗体样式。
人:[ SSN ,姓名,性别]
学生:[ SSN ,Stu_ID,部门,GPA]
员工:[ SSN ,E_ID,公司,薪资]
此处,Student
和Employee
个实体是Person
的子类,Student
和Employee
个子实体都有SSN
作为公共属性。所以,它们是不相交的。它们也是非完整的,因为Person
超类中的条目可能不属于两个子类Student
和Employee
中的任何一个。
所以在这里,我们为超类实体Person
创建一个表,其中SSN
是主键。我们还为子类实体Student
和Employee
创建表,其中SSN
是主键。
例如,假设以下具有属性的实体。主键是粗体样式。
车辆:[ Vehicle_Id ,制作,价格]
MotorVehicle:[ Vehicle_Id ,Engine_cc,Fuel_economy]
自行车:[ Bike_Id ,Cogs,Chainrings]
此处,MotorVehicle
和Bicycle
个实体是MotorVehicle
的子类。 Car
和Bicycle
子实体没有任何重叠属性。所以,他们是不相交的。它们也是完整的,因为Vehicle
超类中的每个条目都必须属于子类MotorVehicle
或Bicycle
所以在这里,我们不为超类实体Vehicle
创建一个表。我们只为子类实体MotorVehicle
和Bicycle
创建表,其中Vehicle_Id
和Bike_Id
分别是主键。它们都包含超类实体的属性。所以这两个表如下。
MotorVehicle:[ Vehicle_Id ,Make,Price,Engine_cc,Fuel_economy]
自行车:[ Vehicle_Id , Bike_Id ,Make,Price,Cogs,Chainrings]