Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

सामान्यीकरण कई तालिकाओं में जुड़ना मुश्किल बनाता है

मैं गलत वर्तनी से बात नहीं करने जा रहा हूँ। चूंकि आप डेटा आयात कर रहे हैं, इसलिए स्टेजिंग टेबल में गलत वर्तनियों को बेहतर ढंग से नियंत्रित किया जाता है।

आइए इस थोड़े से सरलीकृत संस्करण को देखें।

create table stores
(
  store_name varchar(50) primary key,
  street_num varchar(10) not null,
  street_name varchar(50) not null,
  city varchar(50) not null,
  state_code char(2) not null,
  zip_code char(5) not null,
  iso_country_code char(2) not null,
  -- Depending on what kind of store you're talking about, you *could* have
  -- two of them at the same address. If so, drop this constraint.
  unique (street_num, street_name, city, state_code, zip_code, iso_country_code)
);  

insert into stores values 
('Dairy Queen #212',  '232', 'N 1st St SE',   'Castroville',  'CA', '95012', 'US'),
('Dairy Queen #213',  '177', 'Broadway Ave',  'Hartsdale',    'NY', '10530', 'US'),
('Dairy Queen #214', '7640', 'Vermillion St', 'Seneca Falls', 'NY', '13148', 'US'),
('Dairy Queen #215', '1014', 'Handy Rd',      'Olive Hill',   'KY', '41164', 'US'),
('Dairy Mart #101',   '145', 'N 1st St SE',   'Castroville',  'CA', '95012', 'US'),
('Dairy Mart #121',  '1042', 'Handy Rd',      'Olive Hill',   'KY', '41164', 'US');

हालाँकि बहुत से लोग दृढ़ता से मानते हैं कि ज़िप कोड अमेरिका में शहर और राज्य को निर्धारित करता है, लेकिन ऐसा नहीं है। ज़िप कोड का संबंध इस बात से है कि वाहक अपने मार्ग कैसे चलाते हैं, भूगोल के साथ नहीं। कुछ शहर राज्यों के बीच की सीमाओं को फैलाते हैं; एकल ज़िप कोड मार्ग राज्य की रेखाओं को पार कर सकते हैं। यहां तक ​​कि विकिपीडिया यह जानता है , हालांकि उनके उदाहरण पुराने हो सकते हैं। (वितरण मार्ग लगातार बदलते रहते हैं।)

तो हमारे पास एक टेबल है जिसमें दो कैंडिडेट कुंजियाँ हैं,

  • {store_name}, और
  • {street_num, Street_name, City, State_code, zip_code, iso_country_code}

इसकी कोई गैर-महत्वपूर्ण विशेषता नहीं है। मुझे लगता है कि यह तालिका 5NF में है। आपको क्या लगता है?

अगर मैं सड़कों के नामों के लिए डेटा अखंडता बढ़ाना चाहता हूं, तो मैं कुछ इस तरह से शुरू कर सकता हूं।

create table street_names
(
  street_name varchar(50) not null,
  city varchar(50) not null,
  state_code char(2) not null,
  iso_country_code char(2) not null,
  primary key (street_name, city, state_code, iso_country_code)
);  

insert into street_names
select distinct street_name, city, state_code, iso_country_code
from stores;

alter table stores
add constraint streets_from_street_names
foreign key             (street_name, city, state_code, iso_country_code)
references street_names (street_name, city, state_code, iso_country_code);
-- I don't cascade updates or deletes, because in my experience
-- with addresses, that's almost never the right thing to do when a 
-- street name changes.

आप इस प्रक्रिया को शहर के नाम, राज्य के नाम (राज्य कोड) और देश के नामों के लिए दोहरा सकते हैं (और शायद करना चाहिए)।

आपके दृष्टिकोण में कुछ समस्याएं

आप स्पष्ट रूप से क्रोएशिया के लिए देश आईडी के साथ अमेरिका में मौजूद किसी सड़क के लिए एक स्ट्रीट आईडी नंबर दर्ज कर सकते हैं। (किसी शहर का "पूरा नाम", इसलिए बोलने के लिए, इस तरह का तथ्य है जिसे आप शायद डेटा अखंडता बढ़ाने के लिए संग्रहीत करना चाहते हैं। यह शायद सड़क के "पूरे नाम" के बारे में भी सच है।)

प्रत्येक बिट डेटा के लिए आईडी नंबर का उपयोग करने से आवश्यक जॉइन की संख्या बहुत बढ़ जाती है। आईडी नंबर का उपयोग करने का सामान्यीकरण से कोई लेना-देना नहीं है। प्राकृतिक कुंजियों पर संगत विशिष्ट बाधाओं के बिना आईडी संख्याओं का उपयोग करना--एक पूरी तरह से सामान्य गलती--डुप्लिकेट डेटा की अनुमति देता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel डेटाबेस स्कीमा में मध्यमब्लॉब

  2. तैयार कथनों का उपयोग कब *नहीं* करना है?

  3. PHP वैरिएबल और MySQL LIKE क्वेरी काम नहीं कर रही है

  4. PHP/MySQL में भू-खोज (दूरी) (प्रदर्शन)

  5. मैसकल ईएवी मैच पंक्ति फ़ील्ड या इकाई की संपत्ति मूल्य के रूप में