假设您有以下数据库:
Person(ssn NUMERIC(9), name VARCHAR(40), gender CHAR(1)), ssn is primary key
Organization(org_code CHAR(4), budget INTEGER, org_name VARCHAR(60)), org_code is primary key
Person_Organization(ssn, org_code), both columns are the primary key.
person_organization表中的键是否被视为外键或主键?我被困在如何创建这个表。尝试查看我的教科书但无法找到有关它的信息。我不知道它们是否应该是引用主键的外键,或者我是否应该这样做
CREATE TABLE person_organization(ssn NUMERIC(9), org_code VARCHAR(60));
任何建议都将不胜感激。
感谢。
答案 0 :(得分:5)
简单的答案是他们都是。
ssn, org_code
应该是person_organization
的主键。
ssn
应该是一个回到人的外键,org_code
应该通过外键返回organization
。
要将自己与northpole's answer区分开来,我实际上并不同意代理键参数,在这种情况下似乎不需要它,因为它不会在其他地方使用。
不幸的是,针对多对多关系的这个(好的)解决方案的问题在于,通常需要在桌面上有两个唯一的密钥,ssn, org_code
和 org_code, ssn
并选择一个作为主键。
当您使用Oracle时,create table语法将是
create table person_organization
( ssn number(9)
, org_code varchar2(60)
, constraint person_organization_pk primary key (ssn, org_code)
, constraint person_organization_ssn_fk foreign key ( ssn )
references person ( ssn )
, constraint person_organization_oc_fk foreign key ( org_code )
references organization ( org_code )
);
在原始表创建脚本中,ssn
为numeric(9)
,number(9)
应为org_code
。您可能需要考虑不限制此数据类型的大小。您还有varchar
作为varchar2
,这应该是{{1}}。
Tech on the Net是学习语法的非常好的资源。
答案 1 :(得分:1)
我建议将一个唯一的,自动递增的主键添加到PERSON_ORGANIZATION(称为po_id),以及ssn和org_code的两个FOREIGN键。如果你愿意,你也可以将这两个独特。根据我的经验,我喜欢几乎每个表都有自己的唯一/自动键(除非它是查找表或审计表(可能还有其他))。
答案 2 :(得分:0)
他们都是。
对于person_organization表,您将拥有一个由两列组成的复合主键。每个都是另一个表的外键。
对于正常的数据库设计,它们应该引用其他表中的主键,这些约束强制数据库中数据的有效性。
答案 3 :(得分:0)
它们是外键。
您已经列出“两列都是主键”但我不认为它们是。
该表没有主键。 这两个字段的组合肯定充当主键的代理,这样做可以确保条目是唯一标识的,因此可以作为唯一标识符一起使用,但有点不同。
我还建议添加一个单独的主键字段,以便与其他表的结构保持一致。与其他表一样,我建议始终使用id [my favorite]或tablename_id
答案 4 :(得分:0)
这是基本思路,您需要为每个字段提供正确的数据类型
CREATE TABLE Persons (
ssn int(9) NOT NULL PRIMARY KEY,
name varchar(40),
gender CHAR(1)
)
CREATE TABLE Organization (
org_code CHAR(4)NOT NULL PRIMARY KEY,
budget INTEGER,
org_name VARCHAR(60)
)
CREATE TABLE Person_Organization (
ssn int FOREIGN KEY REFERENCES Persons(ssn),
org_code CHAR FOREIGN KEY REFERENCES Organization(org_code)
)