首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类型/子类实体的继承参数

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

Stack Overflow用户
提问于 2016-10-01 03:15:30
回答 1查看 335关注 0票数 0

这是一个复杂的问题,我希望得到一个简单的答案。

桥接实体可以从自己从父实体继承PK/FK属性的子类型实体继承PK吗?会议EDRD示例,我已经创建了一个场景来演示我的意思。

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

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

我不确定的是,希望其他人知道答案,是标签"B“下的桥接实体是否可以从子类型实体个人继承PK/FK属性ConferenceNumber,还是应该与会议有直接关系,比如标为"A”的桥接实体?

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

图书和电影租赁ERD示例

干杯。

EN

回答 1

Stack Overflow用户

发布于 2016-10-03 08:46:59

我成功的一种方法是:

  • 使用( type_name, identifier )的复合键
  • 在整个数据模型中使用此复合键
  • 通过对type_name属性设置约束来约束子类型表中的子类型

在现实生活中,公司和个人都被称为法人,这是一种方便的超级型号。不过,一间公司很可能对某人有不同的识别特征(例如,公司在不同的官僚机构注册,而不是负责向个人发放社会保障号码的机构),因此,我们需要采用一种人为的识别方法。然后,我们可以将实际生活标识符推送到子类型表中。

供审议但超出本答复范围的问题:

  • 有些键仅为外键定义。
  • 所有表都有多个键:哪个(如果有的话)应该提升为主键?(提示:它可能是只为外键定义的!)
  • 在定义复合键时,必须说明列名的顺序:这个顺序重要吗?

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39802665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档