मैंने एक तालिका बनाई जिसमें एक कंपनी के बारे में जानकारी शामिल है। एक विशेषता उनके टेलीफोन नंबर है। एक कंपनी के पास कई टेलीफोन नंबर हो सकते हैं।एसक्यूएल: बहु मूल्यवान गुण
मैं SQL में बहु-मूल्यवान विशेषताओं को कैसे बना सकता हूं?
मैंने एक तालिका बनाई जिसमें एक कंपनी के बारे में जानकारी शामिल है। एक विशेषता उनके टेलीफोन नंबर है। एक कंपनी के पास कई टेलीफोन नंबर हो सकते हैं।एसक्यूएल: बहु मूल्यवान गुण
मैं SQL में बहु-मूल्यवान विशेषताओं को कैसे बना सकता हूं?
आमतौर पर संबंधित डेटाबेस में बहु-मूल्यवान विशेषता जैसी कोई चीज़ नहीं है।
आपकी समस्या के लिए संभावित समाधान:
प्राथमिक कुंजी द्वारा अपनी कंपनी तालिका का संदर्भ और कंपनी प्रति पंक्तियों की undefinite संख्या में शामिल हैं जो फोन नंबर के भंडारण के लिए एक अलग तालिका बनाएँ।
उदाहरण के लिए, यदि आप क्षेत्रों id, name, address, ...
साथ तालिका company
है तो आप क्षेत्रों companyid, phone
के साथ एक मेज companyphones
बना सकते हैं।
(सामान्य रूप से अनुशंसित नहीं है, लेकिन यदि आपको केवल वेबसाइट पर फोन की एक सूची दिखाने की ज़रूरत है तो यह एक विकल्प हो सकता है) वर्चर (...) या टेक्स्ट का उपयोग करके एक फ़ील्ड में टेलीफ़ोन संग्रहीत करना और संख्याओं के बीच विभाजक जोड़ना ।
+1 ध्यान दें कि विकल्प 1 में, 'कंपनीफ़ोन' की अपनी अनूठी कुंजी होनी चाहिए - यह 'कंपनी आईडी' और 'फोन' का संयोजन हो सकता है, या यह एक अलग आईडी फ़ील्ड हो सकता है। –
एक अलग तालिका में की तरह:
CREATE TABLE Company
(
Id int identity primary key,
Name nvarchar(100) not null UNIQUE --UNIQUE is optional
)
GO
CREATE TABLE CompanyPhones
(
Id int identity primary key,
Phone nvarchar(100) not null,
CompanyId int NOT NULL REFERENCES Company(Id) ON DELETE CASCADE
)
इन संरचनाओं का उपयोग कैसे करें:
SELECT CompanyPhones.Phone
FROM Company
JOIN CompanyPhones
ON Company.Id = CompanyPhones.CompanyId
WHERE Company.Name=N'Horns and Hoogs Ltd.'
पहली पंक्ति में आपकी क्वेरी में एक त्रुटि है। यह 'SELECT CompanyPhones.Phone' होना चाहिए। यह एक चरित्र संपादित है और इसलिए मैं इसे बदल नहीं सकता। सफल संपादन के लिए SO को कम से कम 6 वर्ण परिवर्तनों की आवश्यकता है। – pratnala
@pratnala धन्यवाद, –
ओलेग और सेर्गेई के जवाब के अलावा, एक तीसरा विकल्प एक से अधिक फ़ोन बनाने के लिए हो सकता है कंपनी टेबल पर फ़ील्ड - उदाहरण के लिए, क्रमशः मुख्य स्विचबोर्ड और फैक्स लाइन के लिए SwitchboardPhone
और FaxNumber
के रूप में।
इस प्रकार का समाधान आम तौर पर denormalisation के रूप में माना जाता है, और आमतौर पर केवल उपयुक्त है जहां कई विकल्पों की एक छोटी संख्या है, प्रत्येक स्पष्ट रूप से परिभाषित भूमिका के साथ।
तो, उदाहरण के लिए, संपर्क सूची तालिका के लिए लैंडलाइन और मोबाइल/सेलफोन नंबरों का प्रतिनिधित्व करने के लिए यह एक आम तरीका है, लेकिन कंपनी के भीतर सभी फोन एक्सटेंशन की सूची के लिए पूरी तरह से अनुपयुक्त होगा।
आरडीबीएमएस के विभिन्न कार्यान्वयन में कुछ संभावनाएं हैं।
उदाहरण के लिए, PostgreSQL में आप array या hstore या यहाँ तक कि JSON (in 9.3 version) उपयोग कर सकते हैं:
create table Company1 (name text, phones text[]);
insert into Company1
select 'Financial Company', array['111-222-3333', '555-444-7777'] union all
select 'School', array['444-999-2222', '555-222-1111'];
select name, unnest(phones) from Company1;
create table Company2 (name text, phones hstore);
insert into Company2
select 'Financial Company', 'mobile=>555-444-7777, fax=>111-222-3333'::hstore union all
select 'School', 'mobile=>444-999-2222, fax=>555-222-1111'::hstore;
select name, skeys(phones), svals(phones) from Company2
आप भी इन क्षेत्रों पर अनुक्रमणिका बना सकते हैं -, https://dba.stackexchange.com/questions/45820/how-to-properly-index-hstore-tags-column-to-faster-search-for-keysCan PostgreSQL index array columns?
एसक्यूएल सर्वर में, आप की दुकान multivalues लिए एक्सएमएल डेटाप्रकार उपयोग कर सकते हैं:
create table Company (name nvarchar(128), phones xml);
insert into Company
select 'Financial Company', '<phone type="mobile">555-444-7777</phone><phone>111-222-3333</phone>' union all
select 'School', '<phone>444-999-2222</phone><phone type="fax">555-222-1111</phone>'
select
c.name,
p.p.value('@type', 'nvarchar(max)') as type,
p.p.value('.', 'nvarchar(max)') as phone
from Company as c
outer apply c.phones.nodes('phone') as p(p)
भी कर सकते हैं create xml indexes एक्सएमएल प्रकार स्तंभ पर।
आप ** ** ** नहीं करते हैं - जो डेटाबेस डिज़ाइन के पहले सामान्य रूप का भी उल्लंघन करता है। अगर आपकी कंपनी के पास कई फोन नंबर हैं, तो आप उन्हें एक अलग टेबल में डाल दें और उन्हें कंपनी टेबल से लिंक करें। –