2010-07-30 14 views
20

मैं जीमेल जैसे ईमेल मैसेजिंग सिस्टम बनाना चाहता हूं। मुझे निम्नलिखित विकल्प चाहिए: तारांकित, कचरा, स्पैम, ड्राफ्ट, पढ़ें, अपठित। अभी मैं अपने डेटाबेस में नीचे निम्नलिखित संरचना है:ईमेल मैसेजिंग सिस्टम के लिए डेटाबेस डिज़ाइन

CREATE TABLE [MyInbox](
    [InboxID] [int] IDENTITY(1,1) NOT NULL, 
    [FromUserID] [int] NOT NULL, 
    [ToUserID] [int] NOT NULL, 
    [Created] [datetime] NOT NULL, 
    [Subject] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [Body] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [IsRead] [bit] NOT NULL, 
    [IsReceived] [bit] NOT NULL, 
    [IsSent] [bit] NOT NULL, 
    [IsStar] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsStarred] DEFAULT ((0)), 
    [IsTrash] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsTrashed] DEFAULT ((0)), 
    [IsDraft] [bit] NOT NULL CONSTRAINT [DF_MyInbox_Isdrafted] DEFAULT ((0)) 
) ON [PRIMARY] 

लेकिन मैं ऊपर संरचना के साथ कुछ मुद्दों का सामना करना पड़ रहा है। अभी यदि उपयोगकर्ता ए उपयोगकर्ता बी के लिए msessage भेजता है, तो मैं इस तालिका में एक पंक्ति संग्रहित कर रहा हूं लेकिन यदि उपयोगकर्ता बी उस संदेश को हटा देता है तो यह हटा दिया जाता है उपयोगकर्ता के एक भेजे गए संदेश को भी हटा दिया जाता है। यह गलत है, मैं बिल्कुल सामान्य ईमेल संदेश प्रणाली के रूप में चाहता हूं। अगर कोई अपने भेजे गए आइटम से संदेश हटा देता है तो बी को अपने इनबॉक्स से हटाया नहीं जाना चाहिए। मैं यहां दूसरी समस्या पर सोच रहा हूं जो मान लीजिए कि उपयोगकर्ता ए ने एक बार 500 उपयोगकर्ताओं को एक मेल भेजा था, इसलिए मेरे डिजाइन के अनुसार मेरे पास डुप्लिकेट निकायों के साथ 500 पंक्तियां होंगी, यानी इसे स्टोर करने के लिए मेमोरी प्रभावशाली तरीका नहीं है। क्या आप लोग मैसेजिंग सिस्टम के लिए डिज़ाइन बनाने में मेरी मदद कर सकते हैं?

उत्तर

29

आपको इसके लिए अपनी तालिका को विभाजित करने की आवश्यकता है।आप नीचे दिए गए स्कीमा है और संरचना

CREATE TABLE [Users] 
    (
     [UserID] INT , 
     [UserName] NVARCHAR(50) , 
     [FirstName] NVARCHAR(50) , 
     [LastName] NVARCHAR(50) 
    ) 

CREATE TABLE [Messages] 
    (
     [MessageID] INT , 
     [Subject] NVARCHAR(MAX) , 
     [Body] NVARCHAR(MAX) , 
     [Date] DATETIME, 
     [AuthorID] INT, 
    ) 

CREATE TABLE [MessagePlaceHolders] 
    (
     [PlaceHolderID] INT , 
     [PlaceHolder] NVARCHAR(255)--For example: InBox, SentItems, Draft, Trash, Spam 
    ) 

CREATE TABLE [Users_Messages_Mapped] 
    (
     [MessageID] INT , 
     [UserID] INT , 
     [PlaceHolderID] INT, 
     [IsRead] BIT , 
     [IsStarred] BIT 

    ) 

डेटाबेस आरेख सकता है:। alt text http://codeasp.net/Assets/Uploaded-CMS-Files/13f15882-7ed9-4e22-8e2c-20c6527522317-31-2010%2012-51-50%20AM.png

उपयोगकर्ताओं तालिका आप उपयोगकर्ता हो सकते में "संदेश" संदेश के लिए तालिका को दर्शाता है। "MessagePlaceHolders" संदेशों के लिए प्लेसहोल्डर के लिए तालिका इंगित करता है। प्लेसहोल्डर्स इनबॉक्स, भेजे गए आइटम, मसौदे, स्पैम या ट्रैश हो सकते हैं। "Users_Messages_Mapped" उपयोगकर्ताओं और संदेशों के लिए मैपिंग तालिका को इंगित करता है। "UserID" और "PlaceHolderID" विदेशी कुंजी हैं। "IsRead" और "IsStarred" दर्शाता है कि उनका नाम क्या है। यदि "users_Messages_Mapped" तालिका में किसी विशेष संदेश के लिए कोई रिकॉर्ड नहीं मिला है तो रिकॉर्ड संदेश तालिका से हटा दिया जाएगा क्योंकि हमें अब इसकी आवश्यकता नहीं है।

+0

क्या आप कृपया वर्णन कर सकते हैं, हम इस डिज़ाइन में कैसे जानते हैं जो उपयोगकर्ता से और उपयोगकर्ता द्वारा संदेश भेजा जा रहा है। – zarpio

+0

@zarpio संदेश तालिका में लेखक आईडी प्रेषक आईडी है। –

+0

क्या आपके पास User_Messages_Mapped तालिका में एक समग्र कुंजी नहीं होनी चाहिए? – user3308043

3

मुझे लगता है कि आपको अपनी स्कीमा को और अधिक विघटित करने की आवश्यकता है। ईमेल को अलग-अलग स्टोर करें, और इनबॉक्स में संदेशों को इनबॉक्स में मैप करें।

4

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

के उदाहरण पर एक नज़र लेते हैं: एक बी करने के लिए एक संदेश भेजता है, और यह आप recipients ईमेल की एक विशेषता के रूप में सूचीबद्ध साथ, दस्तावेज़ का एक उदाहरण के लिए होता है बी

द्वारा नष्ट कर दिया गया है। जैसे-जैसे उपयोगकर्ता संदेश हटाते हैं, आप या तो उन्हें प्राप्तकर्ता सूची से निकाल देते हैं या उन्हें deleted_by या जो भी आप चुनते हैं उन्हें एक सूची में जोड़ें।

यह आपके द्वारा उपयोग किए जाने वाले डेटा की तुलना में डेटा के लिए एक बहुत अलग दृष्टिकोण है, लेकिन विचार करने के लिए कुछ समय लेना बेहद फायदेमंद हो सकता है।

0

एक संदेश केवल एक ही समय में एक फ़ोल्डर में हो सकता है, इसलिए आप फ़ोल्डर्स टेबल (फ़ोल्डर्स 'ट्रैश', 'इनबॉक्स', 'आर्काइव' इत्यादि) और संदेशों से फ़ोल्डर्स तक एक विदेशी कुंजी चाहते हैं। लेबल के लिए, आपके पास कई से अधिक संबंध हैं, इसलिए आपको एक लेबल तालिका और एक लिंक तालिका (message_labels) की आवश्यकता है। अभिनीत करने के लिए, एक साधारण बिट कॉलम को 'अपठित' के लिए करना चाहिए।

2

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

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

1

आप संदेश संपर्कों के लिए एक टेबल बना सकते हैं जो प्रत्येक संदेश को उन लोगों को जोड़ता है जिनके पास यह मेलबॉक्स में है। जब कोई उपयोगकर्ता संदेश हटा देता है तो संदेश सामग्री से एक पंक्ति हटा दी जाती है लेकिन मूल संदेश संरक्षित होता है।

आप ऐसा कर सकते हैं ... लेकिन मेरा सुझाव है कि आप नहीं करते हैं। जब तक कि यह आपके शिक्षक द्वारा निर्धारित एक अकादमिक अभ्यास नहीं है, तो यह निश्चित रूप से आपके स्वयं के संदेश प्रणाली को विकसित करने के लिए समय की पूरी बर्बादी है। अगर यह होमवर्क है तो आपको ऐसा कहना चाहिए। यदि नहीं, तो इसके बजाय कुछ और उपयोगी करें।

0

क्यों हटाएं? मुझे लगता है कि कुछ भी हटाने की जरूरत नहीं है। हटाए जाने पर उपयोगकर्ताओं से बस इसे छुपाएं। क्योंकि, दोनों पक्षों की जांच करने में समस्या होगी, जब प्रेषक कई प्राप्तकर्ताओं को एक ही संदेश भेजता है। फिर आपको सभी प्राप्तकर्ताओं को जांचना और ध्वजांकित करना होगा। यदि सब ठीक है, तो हटाएं ... मुझे लगता है कि कुछ भी हटाने की आवश्यकता नहीं है।

1
CREATE TABLE `mails` ( 
    `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `message` varchar(10000) NOT NULL DEFAULT '', 
    `file` longblob, 
    `mailingdate` varchar(40) DEFAULT NULL, 
    `starred_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `sender_email` varchar(200) NOT NULL DEFAULT '', 
    `reciever_email` varchar(200) NOT NULL DEFAULT '', 
    `inbox_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `sent_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `draft_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `trash_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `subject` varchar(200) DEFAULT NULL, 
    `read_status` int(10) unsigned NOT NULL DEFAULT '0', 
    `delete_status` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`message_id`) 
) 

आप मेल के भंडारण के लिए इस तालिका का उपयोग और मेल बॉक्स के अनुसार प्रश्नों में हेरफेर कर सकते हैं। मैं उपयोगकर्ता विवरण और लॉगिन विवरण तालिका जैसी शेष सारणी से परहेज कर रहा हूं। आप उन्हें अपनी जरूरत के हिसाब से बना सकते हैं।

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