2011-03-28 11 views

cevap

23

. . .

  • "Personel" her zaman insanları anlatmaktadır.
  • Bazı müşteriler insanlardır.
  • Bazı müşteriler işletmeler (kuruluşlar).
  • "Tedarikçiler" genellikle (her zaman?) kuruluşudur.
  • Personel de müşteriler olabilir.
  • Tedarikçiler de müşteriler olabilir. Personel telefon numaraları, tedarikçi telefon numaraları ve müşteri telefon numaralarının ayrı tablolar sahip ciddi sorunlar var

bulunmaktadır.

  • Personel müşteriler olabilir. Bir personel telefon numarası değişirse, bir müşteri telefon numarası da güncellenmesi gerekiyor mu? Hangisinin güncelleneceğini nereden biliyorsunuz?
  • Tedarikçiler müşteriler olabilir. Bir tedarikçisinin telefon numarası değişirse, bir müşterinin telefon numarası da güncellenmesi gerekiyor mu? Hangisinin güncelleneceğini nereden biliyorsunuz?
  • Sen çoğaltmak ve her masada olduğunu mağaza telefon numaraları hata olmadan telefon numaraları için kısıtlamaları korumak zorundayız. Bir müşterinin telefon numarası değiştiğinde
  • aynı sorunlar ortaya çıkar. Şimdi Eğer personel ve tedarikçisi telefon numaraları da güncelleştirilmesi gerekip gerekmediğini görmek için kontrol etmek gerekir.
  • soruya cevap vermek için "Kimin telefon numarası 123-456-7890 nedir?", 'N' tarafların farklı "çeşit" sayısıdır 'n' farklı tablolarda bakışla, gerek sen uğraşmak. Personel, müşteriler ve tedarikçilere Ayrıca "yüklenicinin telefonları" düşünmek vs. "potansiyel müşterinin telefonlar",

Bir supertype/alt tip şema uygulamak gerekir.(PostgreSQL kod, titizlikle test edilmemiştir.)

create table parties (
    party_id integer not null unique, 
    party_type char(1) check (party_type in ('I', 'O')), 
    party_name varchar(10) not null unique, 
    primary key (party_id, party_type) 
); 

insert into parties values (1,'I', 'Mike'); 
insert into parties values (2,'I', 'Sherry'); 
insert into parties values (3,'O', 'Vandelay'); 

-- For "persons", a subtype of "parties" 
create table person_st (
    party_id integer not null unique, 
    party_type char(1) not null default 'I' check (party_type = 'I'), 
    height_inches integer not null check (height_inches between 24 and 108), 
    primary key (party_id), 
    foreign key (party_id, party_type) references parties (party_id, party_type) on delete cascade 
); 

insert into person_st values (1, 'I', 72); 
insert into person_st values (2, 'I', 60); 

-- For "organizations", a subtype of "parties" 
create table organization_st (
    party_id integer not null unique, 
    party_type CHAR(1) not null default 'O' check (party_type = 'O'), 
    ein CHAR(10), -- In US, federal Employer Identification Number 
    primary key (party_id), 
    foreign key (party_id, party_type) references parties (party_id, party_type) on delete cascade 
); 

insert into organization_st values (3, 'O', '00-0000000'); 

create table phones (
    party_id integer references parties (party_id) on delete cascade, 
    -- Whatever you prefer to distinguish one kind of phone usage from another. 
    -- I'll just use a simple 'phone_type' here, for work, home, emergency, 
    -- business, and mobile. 
    phone_type char(1) not null default 'w' check 
     (phone_type in ('w', 'h', 'e', 'b', 'm')), 
    -- Phone numbers in the USA are 10 chars. YMMV. 
    phone_number char(10) not null check (phone_number ~ '[0-9]{10}'), 
    primary key (party_id, phone_type) 
); 

insert into phones values (1, 'h', '0000000000'); 
insert into phones values (1, 'm', '0000000001'); 
insert into phones values (3, 'h', '0000000002'); 

-- Do what you need to do on your platform--triggers, rules, whatever--to make 
-- these views updatable. Client code uses the views, not the base tables. 
-- In current versions of PostgreSQL, I think you'd create some "instead 
-- of" rules. 
-- 
create view people as 
select t1.party_id, t1.party_name, t2.height_inches 
from parties t1 
inner join person_st t2 on (t1.party_id = t2.party_id); 

create view organizations as 
select t1.party_id, t1.party_name, t2.ein 
from parties t1 
inner join organization_st t2 on (t1.party_id = t2.party_id); 

create view phone_book as 
select t1.party_id, t1.party_name, t2.phone_type, t2.phone_number 
from parties t1 
inner join phones t2 on (t1.party_id = t2.party_id); 

biraz daha bu germek için tablo "personel" kişi alt türünü değil, parti süpertip başvurması gerektiğini uygulamaktır. Organizasyonlar personelde olamaz. tedarikçiler sadece örgütleri, bireylere değil olabilirse

create table staff (
    party_id integer primary key references person_st (party_id) on delete cascade, 
    employee_number char(10) not null unique, 
    first_hire_date date not null default CURRENT_DATE 
); 

, daha sonra tablo uygulayan tedarikçiler benzer şekilde organizasyonlar alt türü başvurmak olacaktır.

Çoğu şirket için, bir müşteri bir kişi veya kuruluş olabilir; bu nedenle, müşteriyi uygulayan bir tablo, üst düzeyine başvurmalıdır.

create table customers (
    party_id integer primary key references parties (party_id) on delete cascade 
    -- Other attributes of customers 
); 
-1

En basit yol muhtemelen en iyisidir. Bir Personel, Müşteri veya Tedarikçilerin telefon, cep telefonu ve faks numarası için bir yeri olsa bile, muhtemelen bu alanları her tabloya koymak en iyisidir.

Ancak, daha fazla alanınız varsa, bir çeşit "miras" veya merkezileştirme düşünmelisiniz. Diğer iletişim bilgilerinin yanı sıra birden fazla telefon numarası varsa, bu ortak değerlerin merkezi bir tabloda, Kişiler olabilir. Müşteri, Tedarikçi vb. Olmaya özel alanlar ayrı masalarda olacaktır. Müşteri tablosu, örneğin, Kişiler'e bir ContactID yabancı anahtarına sahip olacaktır. Bir çok durumda,

0

ben karar, bu iletişim bilgisi ne kadar önemli, ne sıklıkta değiştirir ve ne kadar pratik bir değerlendirmeye dayalı telefon numaraları ile farklı insan tipleri arasında olabilir örtüşme gerektiğini düşünüyorum. Temas bilgisi uçucu ve/veya uygulama için gerçekten merkezi ise, o zaman daha fazla normalizasyon muhtemelen daha iyi olacaktır. Bu, çeşitli MÜŞTERİ, TEDARİKÇİ, ÇALIŞANLAR masalarınızın (vb.), Iletişim türü, iletişim kişisi (müşteri/tedarikçi/çalışan) arasında bir tür üç yönlü kesişme noktasına işaret edebileceği veya daha büyük olasılıkla referans gösterilebileceği bir PHONE_NUMBER tabloya sahip olmak anlamına gelir. temas noktası (telefon). Bu sayede bir çalışanın ana telefon numarası, müşteri kayıtlarının birincil işletme numarası olabilir ve eğer değişirse, o temas noktasının her kullanımı için bir kez değiştirilir. Öte yandan, telefon numaralarını telefonun hafızası için saklıyorsanız ve bunları kullanmıyorsanız ve muhtemelen onları korumıyorsanız, bu çok yönlülüğü ve çabayı modellemek ve bu karmaşıklığı geliştirmeye harcıyorsunuz. Veritabanınız buna değmeyecek ve iyi, eski moda Phone1, Phone2, Phone3, ... MÜŞTERİ, TEDARİKÇİ, ÇALIŞANLARI ya da ne var sütunları yapabilirsiniz. Bu kötü bir veritabanı tasarımıdır, ancak proje önceliklerini tanımlamak için 80/20 kuralını uygularken iyi bir sistem geliştirme uygulamasıdır.

Özetle: Veriler önemliyse, doğru yapın, eğer veriler gerçekten önemli değilse, sadece tokatlayın - ya da daha iyisi, tamamen dışarıda bırakın.

İlgili konular