One Address Table for Many entities?

元气小坏坏 提交于 2020-01-03 04:34:27

问题


Conceptual stage question:

I have several Tables (Person, Institution, Factory) each has many kinds of Addresses (Mailing, Physical)

Is there a way to create a single Address table that contains all the addresses of all the Entities?

I'd rather not have a PersonAddress and FactoryAddress etc set of tables.

Is there another option?

The amount of data will only be several thousand addresses at most, so light in impact.


回答1:


My proposal relies on the principle that one entity (person, Institution, Factory, etc) can have multiple adresses, which is usually the case (home, business, etc), and that one adress can be shared by entities of different nature:

CREATE TABLE ADDRESS
(
    ID INT IDENTITY PRIMARY KEY NOT NULL, 
    .... (your adress fields here)
    id_Person ... NULL,
    id_Institution ... NULL, 
    id_Factory ... NULL 
)

The main limit is that 2 different persons cannot share the same adress. In such a situation, you'll have to go with an additional "EntityAddress" table, like this:

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
)

The last model allows you to share for example one adress for multiple persons working in the same institution.

BUT: according to me, the 'better' solution would be to merge your different entities into one table. You will then need:

  1. An Entity Table, made for all entities
  2. An Entity Type table, that will contain the different entity types. In your case you have at least 3 rows: persons, factories, institution

If one adress per entity is enough, you could go for the address details as properties of the Entity table.

If you need multiple addresses by entity, you'll have to go with the Addresses Table with an Id_Entity as a foreign key.

If you want to share one adress among multiple entities, each entity having potentially multiple adresses (a many-to-many relation between entities and adresses), then you will need to go for the EntityAddres table in addition to the Entity and Address Tables.

Your choice between these models will depend on your needs and your businness rules.




回答2:


You need to use abstraction and inheritance.

An individual and institution (I'd call it organization) are really just concrete representations of an abstract legal party.

A mailing or physical address is the concretion of an abstract address, which could also be an email address, telephone number, or web address.

A legal party can be have zero or more addresses.

An address can be belong to zero or more legal parties.

A party could use the same address for multiple roles, such as 'Home' address and 'Work' address.

If a factory is big enough, sub-facilities in the factory might have their own addresses, so you might want to consider a hierarchical relationship there. For example, each apartment in a condo has one address each. Each building in a large factory might have their own address.

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



回答3:


You could very definitely do this. You could have the Address table that has an ID, then Person, Institution and Factory could all have foreign keys to the Address table.

If you need to be able to distinguish what kind of Address it is at the Address level, you could consider adding an AddressType table and having a foreign key to that on the Address table

Example:

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

...etc




回答4:


Another basic \ bullet proof system would be to organise your model around:

  1. An Entity Table, made for all entities
  2. An Entity Type table, that will contain the different entity types. In your case you have at least 3 rows: persons, factories, institution

If one adress per entity is enough, you could go for the address details as properties of the Entity table.

If you need multiple addresses by entity, you'll have to go with the Addresses Table with an Id_Entity as a foreign key.

If you want to share one adress among multiple entities, each entity having potentially multiple adresses (a many-to-many relation between entities and adresses), then you will need to go for the EntityAddres table in addition to the Entity and Address Tables.

EDIT: this answer was also merged with the other answer I gave here ... so I do not know if it deserves an upvote!




回答5:


in my opinion ,you should create a pivot table to link Entity with her Address for exampleinstitution_addresses(id, id_institution,id_address), person_addresses(id,id_person,id_address) etc...



来源:https://stackoverflow.com/questions/21031323/one-address-table-for-many-entities

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!