概念阶段问题:
我有几个表(人,机构,工厂),每个表都有多种地址(< strong>邮寄,物理)
有没有办法创建单个地址表,其中包含所有实体的所有地址?
我宁愿没有 PersonAddress 和 FactoryAddress 等表格。
还有其他选择吗?
数据量最多只有几千个地址,因此影响很小。
答案 0 :(得分:1)
您需要使用抽象和继承。
individual
和institution
(我称之为组织)实际上只是抽象legal party
的具体表示。
mailing
或physical address
是抽象address
的具体结果,也可以是电子邮件地址,电话号码或网址。
legal party
可以有零个或多个addresses
。
address
可以属于零个或多个legal parties
。
一方可以为多个角色使用相同的地址,例如“主页”地址和“工作”地址。
如果factory
足够大,工厂中的子设施可能有自己的地址,因此您可能需要考虑那里的层次关系。例如,公寓中的每个公寓都有一个地址。大型工厂中的每栋建筑都可能有自己的地址。
create table party (
party_id identity primary key
);
create table individual (
individual_id int primary key references party(party_id),
...
);
create table organization (
organization_id int primary key references party(party_id),
...
);
create table address (
address_id identity primary key,
...
);
create table mailing_address (
address_id int primary key references address(address_id),
...
);
create table party_address (
party_id int references party(party_id),
address_id int references address(address_id),
role varchar(255), --this should really point to a role table
primary key (party_id, address_id, role)
);
create table facility (
facility_id identity primary key,
address_id int not null references address(address_id),
parent_id int null references facility(facility_id)
);
答案 1 :(得分:0)
你绝对可以这样做。您可以使用具有ID的Address表,然后Person,Institution和Factory都可以拥有Address表的外键。
如果您需要能够区分地址级别的地址类型,可以考虑添加一个AddressType表并在地址表上添加一个外键
示例:
CREATE TABLE ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
City VARCHAR(50) NOT NULL,
State VARCHAR(2) NOT NULL,
Zip VARCHAR(10) NOT NULL,
AddressLine1 VARCHAR(200) NOT NULL,
AddressLine2 VARCHAR(200) NOT NULL,
)
CREATE TABLE Person
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
AddressID INT FOREIGN KEY REFERENCES Address(ID)
)
CREATE TABLE Institution
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
AddressID INT FOREIGN KEY REFERENCES Address(ID)
)
...等
答案 2 :(得分:0)
我的提议依赖于一个实体(人,机构,工厂等)可以有多个地址的原则,通常情况(家庭,商业等),并且一个地址可以由不同的实体共享性质:
CREATE TABLE ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
.... (your adress fields here)
id_Person ... NULL,
id_Institution ... NULL,
id_Factory ... NULL
)
主要限制是2个不同的人不能共享相同的地址。在这种情况下,您必须使用额外的“EntityAddress”表,如下所示:
CREATE TABLE ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
.... (your adress fields here)
)
CREATE TABLE ENTITY_ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL
id_Address .... NOT NULL,
id_Person .... NULL,
id_Institution ... NULL,
id_Factory .... NULL
)
最后一个模型允许您为在同一机构工作的多个人共享一个地址。
但是:据我所知,“更好”的解决方案是将不同的实体合并到一个表中。然后你需要:
如果每个实体的一个地址足够,您可以将地址详细信息作为实体表的属性。
如果您需要按实体分配多个地址,则必须使用地址表并将Id_Entity作为外键。
如果您想在多个实体之间共享一个地址,每个实体可能有多个地址(实体和地址之间的多对多关系),那么除了实体和实体之外,您还需要使用EntityAddres表。地址表。
您在这些模型之间的选择将取决于您的需求和您的业务规则。
答案 3 :(得分:0)
另一个基本的\防弹系统是组织你的模型:
如果每个实体的一个地址足够,您可以将地址详细信息作为实体表的属性。
如果您需要按实体分配多个地址,则必须使用地址表并将Id_Entity作为外键。
如果您想在多个实体之间共享一个地址,每个实体可能有多个地址(实体和地址之间的多对多关系),那么除了实体和实体之外,您还需要使用EntityAddres表。地址表。
编辑:这个答案也与我在这里给出的另一个答案合并......所以我不知道它是否值得一个赞成!答案 4 :(得分:0)
在我看来,你应该创建一个数据透视表来链接Entity和她的地址
例如institution_addresses(id, id_institution,id_address), person_addresses(id,id_person,id_address)
等......