2008-10-08 28 views
12

चलिए एक उदाहरण देखें - किताबें। एक पुस्तक में 1. एन लेखकों हो सकते हैं। एक लेखक के पास 1. एमएम किताबें हो सकती हैं। पुस्तक के सभी लेखकों का प्रतिनिधित्व करने का एक अच्छा तरीका क्या है?आप एक रिलेशनल डेटाबेस में m..n रिश्तों से कैसे निपटते हैं?

मैं पुस्तकें तालिका और लेखक तालिका बनाने के विचार के साथ आया था। लेखकों की तालिका में प्राथमिक लेखक आईडी लेखक का नाम है। पुस्तक तालिका में पुस्तक के बारे में प्राथमिक पुस्तक आईडी और मेटाडेटा है (शीर्षक, प्रकाशन दिनांक, आदि)। हालांकि, किताबों को लेखकों और लेखकों को पुस्तकें जोड़ने का एक तरीका होना चाहिए। और यह वह जगह है जहां समस्या है।

मान लें कि हमारे पास बॉब द्वारा तीन पुस्तकें हैं। हालांकि, एक पुस्तक पर, उन्होंने इसे बॉब, पीएचडी के रूप में लिखा। एक और उन्होंने डॉ बॉब के रूप में लिखा, और एक तिहाई उन्होंने डॉ रॉबर्ट के रूप में लिखा। मैं इस तथ्य की पहचान करने में सक्षम होना चाहता हूं कि वास्तव में, वही व्यक्ति, वही व्यक्ति हैं, लेकिन अलग-अलग नामों के तहत श्रेय दिया जाता है। मैं बॉब को एक और बॉब से अलग करना चाहता हूं जिसने विभिन्न किताबें लिखीं।

अब चलिए एक आवेदन में एक और हिस्सा भी जोड़ते हैं, एक व्यक्ति तालिका जो दिलचस्प लोगों का ट्रैक रखती है। और मान लें कि बॉब एक ​​दिलचस्प व्यक्ति है। मैं केवल इतना नहीं कहना चाहता कि सभी तीन पुस्तकों का लेखक बॉब है, लेकिन यह दिलचस्प बॉब लेखक बॉब के समान बॉब है।

तो इस तरह के संभावित जटिल मैपिंग के लिए कौन सी रणनीतियों मौजूद हैं, यह सुनिश्चित करते हुए कि पुस्तक लेखकों को कवर पर नाम से पहचाना जाता है?

उत्तर

26

BookID, AuthorID, और NameUsed के लिए कॉलम के साथ BookAuthors नामक एक और तालिका जोड़ें। NameUsed के लिए एक पूर्ण मान इसके बजाय लेखक की तालिका से खींचने का मतलब होगा। इसे एक छेड़छाड़ तालिका कहा जाता है।

+3

स्पष्ट रूप से जोएल मेरे मुकाबले 46 सेकंड तेज तेज है। –

+0

और यदि मैं चाहता था, तो मैं बुकिड, पर्सिड आईडी, नेमयूस्ड का भी उपयोग कर सकता हूं और कह सकता हूं कि एक लेखक सिर्फ एक व्यक्ति का विशेष मामला है। –

+0

हालांकि यह इस बात पर निर्भर करेगा कि मैंने "दिलचस्प व्यक्ति" को कैसे परिभाषित किया है, शायद शायद हर लेखक एक दिलचस्प व्यक्ति नहीं होगा। –

5

मुझे लगता है कि आप वहां बहुत अधिक हैं। आपको पुस्तक की प्राथमिक कुंजी, लेखक की प्राथमिक कुंजी और "उद्धृत" टेक्स्ट फ़ील्ड के साथ एक पुस्तक लेख, एक लेखक तालिका, और फिर "लेखक_of_books" तालिका की आवश्यकता होती है, यह दर्शाता है कि उस पुस्तक पर उस विशेष लेखक का उद्धरण कैसे दिया गया था ।

0

1..n संबंध के लिए (लेखक कई किताबें है, लेखक कई उपनाम हैं):

  1. में लेखक की ओर इंगित करता पुस्तकें एक विदेशी कुंजी author_id रखो।
  2. उपनाम जानकारी रखने के लिए एक नई तालिका, author_aliases बनाएं।
  3. उपनाम पर इंगित करने वाली पुस्तकों में एक विदेशी कुंजी alias_id रखें (लेखक विवरण डिफॉल होने पर शून्य हो सकता है)।
  4. author_aliases में author_id विदेशी कुंजी रखें।

यदि आप चाहें, तो आप लेखकों और पुस्तकों को जोड़ने के लिए मध्यस्थ तालिकाओं का उपयोग कर सकते हैं, लेकिन 1..n मैपिंग के साथ मुझे नहीं लगता कि यह आवश्यक है।

एक n..m संबंध के लिए (लेखक कई किताबें, पुस्तक किया है कई लेखकों):

आप किताब में विदेशी चाबियों का एक मध्यस्थ के शामिल होने तालिका (author_id, alias_id, book_id) का उपयोग करने के बजाय होता तालिका। आप विदेशी कुंजी को उपनाम से लेखक तक रखना चाहते हैं (लेखक उपनामों के आसान लुकअप के लिए उनकी सभी पुस्तकों के माध्यम से जाने के बिना)।

आप तर्क दे सकते हैं कि भविष्य में स्केलेबिलिटी के मामले में यह भी शुरू करने का एक बेहतर तरीका है, भले ही प्रारंभिक विनिर्देश कहता है कि कुछ 1. 1. रिश्ते है। आप पाएंगे कि दिए गए विनिर्देश (या प्रश्न) अक्सर अपर्याप्त हैं, इसलिए जब आप विनिर्देश बदलते हैं या स्पष्टीकरण के लिए सामान्य तरीके से डिजाइन करना चाहते हैं।

+0

यह सहयोग को संभाल नहीं पाएगा: एन लेखकों तक एक ही पुस्तक पर काम किया। –

+1

"आप 1..एन रिश्तों के साथ कैसे निपटते हैं" - प्रश्न उदाहरण स्पष्ट रूप से 1 तक सीमित होना चाहिए। संबंधों - एम नहीं: रिश्ते। – JeeBee

+0

1..n एक पुस्तक पर लेखकों की संख्या को संदर्भित करता है। मुझे प्रश्न शीर्षक दोबारा शुरू करना चाहिए। वास्तव में किताबों पर सहयोग हो सकता है जहां 1 पुस्तक के लेखक हैं। –

3

यह कई से अधिक रिश्तों की तरह लगता है, 1-से-कई नहीं। मुझे लगता है कि आप उन दोनों के बीच एक टेबल का उपयोग करना चाहेंगे जो आपको इसके दोनों ओर 1 से कई परिभाषित करने की अनुमति देता है। इस बाहर की जाँच करें ...

http://www.tekstenuitleg.net/en/articles/database_design_tutorial/8

1

यह देखते हुए कि डॉ बॉब और डॉ रॉबर्ट और बॉब, पीएचडी सब एक ही व्यक्ति हैं, वे एक ही पंक्ति के लेखकों तालिका में लिंक होगा।

हालांकि, मुझे लगता है कि आपको जो चाहिए वह एक व्यक्ति तालिका है जो लेखकों से जुड़ा हुआ है। आप अपनी रोचक व्यक्ति तालिका को भी लिंक कर सकते हैं। इस तरह लेखक बॉब और लेखक रॉबर्ट के साथ-साथ बॉब को दिलचस्प बॉब लिंक भी शामिल है। उम्मीद है कि समझ में आता है।

1

पहली बात जो दिमाग में आती है वह एक लिंक टेबल है, जिसे शायद लेखक लेखकों को उनके लेखकों के साथ लिंक करने के लिए कहा जाता है।

कॉलम लेखक आईडी, बुकआईडी और शायद क्रेडिटए होंगे, इसलिए आप डॉ बॉब और बॉब, पीएचडी के बीच अंतर कर सकते हैं। (साथ ही स्टीफन किंग और रिचर्ड बाचमन जैसे कलम नाम)।

और आप अभी भी लेखक की विशिष्ट पहचान कर सकते हैं।

1

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

मैं सबसे दानेदार स्तर पर व्यक्ति से शुरू करूंगा और कहूंगा कि कोई भी लेखक एक व्यक्ति होना चाहिए। मैं उस प्रक्रिया को सरल बना दूंगा।

व्यक्ति की जानकारी और व्यक्ति आईडी के साथ एक व्यक्ति तालिका बनाएं, वहां जानकारी डालें।

फिर बुकमूटर टेबल बनाएं, जिसमें 3 कॉलम बुकआईड, पर्सनलआईड, टाइटल नाम शामिल हैं। यदि आवश्यक हो तो इस तरह आप एक अलग नाम का उपयोग कर सकते हैं, यदि नहीं, तो आप COALESE या डिफ़ॉल्ट नाम प्राप्त करने के समान कुछ उपयोग कर सकते हैं यदि TitledName शून्य है।

बस एक विचार ..

7

आप आवश्यकता होगी तीन टेबल -

  1. बुक
  2. लेखक
  3. BookAuthors

बुक पुस्तक आईडी, पुस्तक का शीर्षक होते हैं, और पुस्तक के बारे में एकत्र करने के लिए आपको आवश्यक सभी अन्य जानकारी।

लेखक में लेखक आईडी के साथ-साथ अन्य नाम जैसे अंतिम नाम, अंतिम नाम जिसे आपको किसी दिए गए लेखक के बारे में एकत्र करने की आवश्यकता होगी।

बुकऑथर्स बुकिड, AuthorID, और NameUsed युक्त कई से अधिक शामिल होंगे। यह पुस्तक को शून्य या कई लेखकों के लिए अनुमति देता है, लेखक के लिए शून्य या कई किताबें होती हैं, और उस संबंध के बारे में जानकारी के लिए कब्जा कर लिया जाता है। उदाहरण के लिए, आप BookAuthor तालिका पर एक कॉलम भी कर सकते हैं जिसने पुस्तक के लेखक के संबंध ("द्वारा संपादित", "Fore word by") का वर्णन किया है।

1

आप वास्तव में क्या पूछ रहे हैं यह नहीं है कि आप 1..n रिश्तों के साथ कैसे निपटते हैं, लेकिन एन रिश्तों (लेखक पर प्रभावी रूप से और कई किताबें हैं, और एक पुस्तक में कई लेखक हो सकते हैं)।

इस संभाल करने के लिए बढ़िया तरीका एक मध्यवर्ती मेज के माध्यम से है, इसलिए

लेखक तालिका (authorID, authorDetails) बुक तालिका (bookID, पुस्तक विवरण) AuthorBook तालिका (authorID, bookID)

हैं क्या तुम सच में लेखक नाम बदल तो एक 1..n लेखक विवरण तालिका का उपयोग के बारे में परेशान कर रहे हैं, तो

authorDetails (authorID, Itemid, authorDetails)

और फिर से जोड़ने PostgreSQL में लेखक मेज से authorDetails ले जाने

0

एक संभव कार्यान्वयन, सिर्फ मनोरंजन के लिए:

create table books (
    book_id integer primary key, 
    title varchar not null 
); 

create table aliases (
    alias_id integer primary key, 
    alias varchar not null 
); 

create table books_aliases (
    book_id integer references books (book_id), 
    alias_id integer references aliases (alias_id), 
    primary key (book_id, alias_id) 
); 

create table authors (
    author_id integer primary key, 
    author varchar not null, 
    interesting boolean default false 
); 

create table aliases_authors (
    alias_id integer references aliases (alias_id), 
    author_id integer references authors (author_id), 
    primary key (alias_id, author_id) 
); 

create view books_aliases_authors as 
    select * from books 
    natural join books_aliases 
    natural join aliases 
    natural join aliases_authors 
    natural join authors; 

एक के बजाय "का उपयोग कर" इस्तेमाल कर सकते हैं प्राकृतिक में शामिल होने:

create view books_aliases_authors as 
    select * 
    from books 
    join books_aliases using (book_id) 
    join aliases using (alias_id) 
    join aliases_authors using (alias_id) 
    join authors using (author_id); 

या mysql संगतता के लिए जटिल चीज करें (ध्यान दें कि mysql को उपरोक्त वर्चर्स के लिए एक स्पष्ट अधिकतम लंबाई की भी आवश्यकता होगी):

create view books_aliases_authors as 
    select b.book_id, title, l.alias_id, alias, t.author_id, author, interesting 
    from books b 
    join books_aliases bl on bl.book_id = b.book_id 
    join aliases l on bl.alias_id = l.alias_id 
    join aliases_authors lt on lt.alias_id = l.alias_id 
    join authors t on t.author_id = lt.author_id; 

यह उदाहरण "लोगों" तालिका का उपयोग नहीं करता है, केवल लेखकों के लिए एक "दिलचस्प" ध्वज। कृपया ध्यान दें कि कुछ भी नहीं परिवर्तन (संरचनात्मक रूप से), यदि आप "लेखकों" को "लोगों" का नाम बदलते हैं

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