2012-01-15 5 views
10

मैंने एक तालिका बनाई जिसमें एक कंपनी के बारे में जानकारी शामिल है। एक विशेषता उनके टेलीफोन नंबर है। एक कंपनी के पास कई टेलीफोन नंबर हो सकते हैं।एसक्यूएल: बहु मूल्यवान गुण

मैं SQL में बहु-मूल्यवान विशेषताओं को कैसे बना सकता हूं?

+2

आप ** ** ** नहीं करते हैं - जो डेटाबेस डिज़ाइन के पहले सामान्य रूप का भी उल्लंघन करता है। अगर आपकी कंपनी के पास कई फोन नंबर हैं, तो आप उन्हें एक अलग टेबल में डाल दें और उन्हें कंपनी टेबल से लिंक करें। –

उत्तर

7

आमतौर पर संबंधित डेटाबेस में बहु-मूल्यवान विशेषता जैसी कोई चीज़ नहीं है।

आपकी समस्या के लिए संभावित समाधान:

  1. प्राथमिक कुंजी द्वारा अपनी कंपनी तालिका का संदर्भ और कंपनी प्रति पंक्तियों की undefinite संख्या में शामिल हैं जो फोन नंबर के भंडारण के लिए एक अलग तालिका बनाएँ।

    उदाहरण के लिए, यदि आप क्षेत्रों id, name, address, ... साथ तालिका company है तो आप क्षेत्रों companyid, phone के साथ एक मेज companyphones बना सकते हैं।

  2. (सामान्य रूप से अनुशंसित नहीं है, लेकिन यदि आपको केवल वेबसाइट पर फोन की एक सूची दिखाने की ज़रूरत है तो यह एक विकल्प हो सकता है) वर्चर (...) या टेक्स्ट का उपयोग करके एक फ़ील्ड में टेलीफ़ोन संग्रहीत करना और संख्याओं के बीच विभाजक जोड़ना ।

+0

+1 ध्यान दें कि विकल्प 1 में, 'कंपनीफ़ोन' की अपनी अनूठी कुंजी होनी चाहिए - यह 'कंपनी आईडी' और 'फोन' का संयोजन हो सकता है, या यह एक अलग आईडी फ़ील्ड हो सकता है। –

15

एक अलग तालिका में की तरह:

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.' 
+0

पहली पंक्ति में आपकी क्वेरी में एक त्रुटि है। यह 'SELECT CompanyPhones.Phone' होना चाहिए। यह एक चरित्र संपादित है और इसलिए मैं इसे बदल नहीं सकता। सफल संपादन के लिए SO को कम से कम 6 वर्ण परिवर्तनों की आवश्यकता है। – pratnala

+0

@pratnala धन्यवाद, –

6

ओलेग और सेर्गेई के जवाब के अलावा, एक तीसरा विकल्प एक से अधिक फ़ोन बनाने के लिए हो सकता है कंपनी टेबल पर फ़ील्ड - उदाहरण के लिए, क्रमशः मुख्य स्विचबोर्ड और फैक्स लाइन के लिए SwitchboardPhone और FaxNumber के रूप में।

इस प्रकार का समाधान आम तौर पर denormalisation के रूप में माना जाता है, और आमतौर पर केवल उपयुक्त है जहां कई विकल्पों की एक छोटी संख्या है, प्रत्येक स्पष्ट रूप से परिभाषित भूमिका के साथ।

तो, उदाहरण के लिए, संपर्क सूची तालिका के लिए लैंडलाइन और मोबाइल/सेलफोन नंबरों का प्रतिनिधित्व करने के लिए यह एक आम तरीका है, लेकिन कंपनी के भीतर सभी फोन एक्सटेंशन की सूची के लिए पूरी तरह से अनुपयुक्त होगा।

+0

तय किया गया है लेकिन अगर 2 फैक्स संख्याएं हैं तो क्या होगा? बूम – pratnala

+0

@ प्रतानाला: वास्तव में बूम; लेकिन आप कितने कंपनियों को जानते हैं कि एक से अधिक फैक्स (या यहां तक ​​कि एक है, इन दिनों)? –

+0

पर्याप्त मेला। लेकिन मुझे लगता है कि कुछ भी मौका छोड़ना अच्छा नहीं है। – pratnala

3

आरडीबीएमएस के विभिन्न कार्यान्वयन में कुछ संभावनाएं हैं।

उदाहरण के लिए, 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  

sql fiddle demo

आप भी इन क्षेत्रों पर अनुक्रमणिका बना सकते हैं -, 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) 

sql fiddle demo

भी कर सकते हैं create xml indexes एक्सएमएल प्रकार स्तंभ पर।

संबंधित मुद्दे