许多实体的一个地址表?

时间:2014-01-09 21:16:40

标签: sql sql-server database-design

概念阶段问题:

我有几个表(机构工厂),每个表都有多种地址(< strong>邮寄,物理

有没有办法创建单个地址表,其中包含所有实体的所有地址

我宁愿没有 PersonAddress FactoryAddress 等表格。

还有其他选择吗?

数据量最多只有几千个地址,因此影响很小。

5 个答案:

答案 0 :(得分:1)

您需要使用抽象和继承。

individualinstitution(我称之为组织)实际上只是抽象legal party的具体表示。

mailingphysical 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
)

最后一个模型允许您为在同一机构工作的多个人共享一个地址。

但是:据我所知,“更好”的解决方案是将不同的实体合并到一个表中。然后你需要:

  1. 为所有实体制作的实体表
  2. 实体类型表,它将包含不同的实体类型。 在你的情况下,你至少有3行:人,工厂, 机构
  3. 如果每个实体的一个地址足够,您可以将地址详细信息作为实体表的属性。

    如果您需要按实体分配多个地址,则必须使用地址表并将Id_Entity作为外键。

    如果您想在多个实体之间共享一个地址,每个实体可能有多个地址(实体和地址之间的多对多关系),那么除了实体和实体之外,您还需要使用EntityAddres表。地址表。

    您在这些模型之间的选择将取决于您的需求和您的业务规则。

答案 3 :(得分:0)

另一个基本的\防弹系统是组织你的模型:

  1. 为所有实体制作的实体表
  2. 实体类型表,它将包含不同的实体类型。在您的情况下,您至少有3行:人员,工厂,机构
  3. 如果每个实体的一个地址足够,您可以将地址详细信息作为实体表的属性。

    如果您需要按实体分配多个地址,则必须使用地址表并将Id_Entity作为外键。

    如果您想在多个实体之间共享一个地址,每个实体可能有多个地址(实体和地址之间的多对多关系),那么除了实体和实体之外,您还需要使用EntityAddres表。地址表。

    编辑:这个答案也与我在这里给出的另一个答案合并......所以我不知道它是否值得一个赞成!

答案 4 :(得分:0)

在我看来,你应该创建一个数据透视表来链接Entity和她的地址 例如institution_addresses(id, id_institution,id_address), person_addresses(id,id_person,id_address)等......