子类型/子类实体的继承参数

问题描述:

这是一个复杂的问题,我希望得到一个简单的答案。子类型/子类实体的继承参数

桥接实体是否可以从一个子类型实体继承PK,该实体本身从其父实体继承了PK/FK属性? Conference EDRD Example我做了一个场景来演示我的意思。

所以在这个例子中,有一个父实体捕获有关会议的信息。会议有两种可能的子类型:个人和商业,它们有自己的“特殊”属性,并且没有显示为不必要。

有两个桥接实体,用于捕获出席会议的个人或企业的详细信息。您将看到标有“A”的桥接实体具有直接连接到CONFERENCE实体的桥接实体。我的理解是CONFERENCE_BUSINESS中的PK/FK属性ConferenceNumber是可以接受的。

我什么不确定,以及其他希望有人知道答案,是能否桥接实体标记“B”可以继承PK之下/ FK属性ConferenceNumber来自亚型实体的个体,或者它应该也有一个直接与会议的关系,如标有“A”的桥接实体?

一个更好的例子是当你有书和电影作为子类型,并且你希望捕获作者和演员的细节。由于一本书或多本书的作者以及多部电影或多部电影的作者可能有多个作者,我想使用子类型鉴别器来捕获这类数据。我想知道是否有人知道(并且可以引用合法来源显示)样本Book and Movie Rental ERD:DVD_ACTOR和BOOK_AUTHOR中的桥接实体是否可以从我创建的子类继承PK/FK?

Book and Movie rental ERD example

干杯。

+0

你的问题是部分在这里找到答案。 http://*.com/questions/13749525/relational-database-design-multiple-user-types/13752304#13752304 –

一种方法我已经有很多成功的用是:

  • 使用(type_name, identifier)
  • 使用整个数据模型
  • 这种复合键复合键的亚型表约束亚型通过对type_name属性施加约束

在现实生活中,公司和个人被称为legal persons,便利这个模型的超级类型。然而,一家公司可能对一个人的标识符不同(例如,一家公司向不同的官僚机构注册,而不是一个负责向个人发放社会安全号码的机构),因此我们需要使用人工标识符。然后,我们可以将真实生活标识符推送到子类型表中。

问题的考虑,但超出了这个答案范围:

  • 有些键外键
  • 所有表多于一个关键的目的仅仅定义:它(如果有的话)应该是晋升为主键? (提示:它可能是关键仅仅是为了外键的目的而定义的!)
  • 定义复合键时必须声明列名的顺序:这个顺序重要吗?

以下SQL DDL需要ANSI-92查询模式,但可以使用Access GUI工具重新创建。请注意,我用LocationCountryCode作为通用于各类会议的一个属性,而SloganOrganizerPaysExpenses具体分别为公司和个人的亚型:

CREATE TABLE LegalPersons 
(PersonNumber INT NOT NULL UNIQUE, 
    PersonType CHAR(10) NOT NULL, 
    CHECK (PersonType IN ('Individual', 'Company')), 
    UNIQUE (PersonType, PersonNumber)); 


CREATE TABLE Individuals 
(PersonNumber INT NOT NULL UNIQUE, 
    PersonType CHAR(10) NOT NULL, 
    CHECK (PersonType = 'Individual'), 
    UNIQUE (PersonType, PersonNumber), 
    FOREIGN KEY (PersonType, PersonNumber) 
    REFERENCES LegalPersons (PersonType, PersonNumber), 
    LastName VARCHAR(35) NOT NULL, 
    FirstName VARCHAR(35) NOT NULL); 


CREATE TABLE Companies 
(PersonNumber INT NOT NULL UNIQUE, 
    PersonType CHAR(10) NOT NULL, 
    CHECK (PersonType = 'Company'), 
    UNIQUE (PersonType, PersonNumber), 
    FOREIGN KEY (PersonType, PersonNumber) 
    REFERENCES LegalPersons (PersonType, PersonNumber), 
    CompanyRegisteredNumber CHAR(8) NOT NULL UNIQUE); 


CREATE TABLE Conferences 
(ConferenceNumber CHAR(10) NOT NULL UNIQUE, 
    PersonNumber INT NOT NULL, 
    PersonType CHAR(10) NOT NULL, 
    FOREIGN KEY (PersonType, PersonNumber) 
    REFERENCES LegalPersons (PersonType, PersonNumber), 
    UNIQUE (PersonType, ConferenceNumber), 
    LocationCountryCode CHAR(3) NOT NULL); 


CREATE TABLE BusinessConferences 
(ConferenceNumber CHAR(10) NOT NULL UNIQUE, 
    PersonType CHAR(10) NOT NULL, 
    CHECK (PersonType = 'Company'), 
    FOREIGN KEY (PersonType, ConferenceNumber) 
    REFERENCES Conferences (PersonType, ConferenceNumber), 
    Slogan VARCHAR(100) NOT NULL); 


CREATE TABLE IndividualConferences 
(ConferenceNumber CHAR(10) NOT NULL UNIQUE, 
    PersonType CHAR(10) NOT NULL, 
    CHECK (PersonType = 'Individual'), 
    FOREIGN KEY (PersonType, ConferenceNumber) 
    REFERENCES Conferences (PersonType, ConferenceNumber), 
    OrganizerPaysExpenses CHAR(1) DEFAULT 'Y' NOT NULL, 
    CHECK (OrganizerPaysExpenses IN ('Y', 'N'))); 
+0

H谢谢你的回复。我了解你的一些回应,除了你通过复合键的意思吗?你是指复合键吗?如果我看到图表,我可能会更好地理解。 – Ableman

+0

根据新关系数据库词典:术语,概念和示例作者:C.J. Date,“组合键/复合键=术语可互换使用,表示由两个或更多属性组成的键”。 – onedaywhen

+0

您可以执行SQL DDL语句,然后在Access中使用ERD thingy?虽然可能有错误,因为它未经测试! – onedaywhen