2012-10-10 16 views
7

मैं एक मेज उपयोगकर्ताओं है:तालिका डिजाइन सलाह

user_id - name 

और उन उपयोगकर्ताओं के लिए एक लेख बनाने और उसके बाद अन्य सदस्यों, टेबल लेख के साथ साझा कर सकते हैं:

article_id - user_id - article_name 

प्रश्न सबसे अच्छा तरीका है इसे साझा करने के लिए ... मैं एक और टेबल सोच रहा हूं article_shares:

share_id - article_id - user_id 

यह सभी उपयोगकर्ताओं को आसानी से उस सूची तक सूचीबद्ध करेगा एर्टिकल और निर्माता को उस लेख से

के लिए उस तालिका से जोड़ने या हटाने में सक्षम होने की पहुंच होगी, इसलिए, जब लेख निर्माता (user_id 123) अपने लेखों को देखता है तो वह अन्य सभी उपयोगकर्ताओं की एक सूची देख सकता है

select as.user_id, a.article_name from article_shares as 
join users u on u.user_id = as.user_id 
join articles a on a.article_id = as.article_id where u.user_id = '123' 

साथ प्रत्येक लेख और एक उपयोगकर्ता (456 user_id) लेखों की सूची वे साझा किया गया है

select a.article_name from articles a 
join article_shares as on as.article_id = a.article_id 
where as.user_id = '456' 

इस तार्किक प्रतीत होता है देख सकते हैं साझा किया है? क्या मैं सही रास्ते पर हूं?

किसी भी मदद

+3

हां मेरे लिए ठीक लग रहा है। आपको साझा लेखों को उन उपयोगकर्ताओं को जोड़ने के लिए कुछ तरीका चाहिए जो उन्हें देख सकते हैं, मैं एक आसान तरीका नहीं सोच सकता। – Jay

+0

@Jay धन्यवाद, केवल अपने आप को सिखाया मिलती है के बारे में दो दिन पहले तो समय देने के लिए देखने के लिए के लिए धन्यवाद! –

+0

आप सही रास्ते पर हैं। एक बार जब आप जॉइन, और इसके सभी रूपों (INNER, LEFT इत्यादि) का उपयोग करने में सहज महसूस करते हैं तो आप महसूस कर सकते हैं कि ऐसा कुछ भी नहीं है जिसे आप नहीं कर सकते! :) –

उत्तर

1

आप यह सही मिल गया है के लिए धन्यवाद। आप उत्सुक हैं, तो आप users और articles के बीच अपने कई-से-अनेक संबंध बनाने के लिए एक junction table कर दिया है, और इस काफी मानक है।

आप अक्सर ArticlesToUsers या कुछ इसी तरह की तरह नामित तालिकाओं के इन प्रकार देखेंगे, और है कि कभी कभी यह है कि आप एक जंक्शन मेज पर देख रहे हैं आप से दूर टिप पहला तरीका हो जाएगा। बेशक, नामकरण योजनाएं बहुत ही व्यक्तिपरक हैं, इसलिए नाम बदलने की आवश्यकता महसूस न करें। article_shares मुझे एक अच्छा वर्णन की तरह लगता है।

@MaxVT का प्रदर्शन किया है के रूप में, आपको लगता है कि कई डेवलपर्स इस तरह एक जंक्शन मेज पर एक surrogate key डाल नहीं होगा, और नहीं बल्कि सिर्फ प्राथमिक कुंजी (article_id, user_id) के रूप में दोनों स्तंभ का प्रयोग करेंगे मिल जाएगा। विकल्प स्पष्ट रूप से तुम्हारा है और डेटाबेस तालिकाओं के बाकी के अनुरूप रहने, हालांकि आप निश्चित रूप से जंगली में सभी क्रमपरिवर्तन देखेंगे के साथ क्या करना अधिक हो सकता है। घटना है कि आप अपने किराए की कुंजी रखने के प्रयास करना चाहिए, मैं वैसे भी डुप्लिकेट को खत्म करने article_id, user_id की एक अद्वितीय बाधा की सलाह देते हैं (क्यों एक लेख में दो बार एक उपयोगकर्ता के लिए साझा करने के लिए की आवश्यकता होगी?)।

+0

धन्यवाद टिम, उस सलाह की सराहना करें! –

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