मैं एक डेटाबेस / तालिका को स्टैक के रूप में कैसे लागू करूं


11

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

मैं सोच रहा था कि डेटाबेस का उपयोग करके स्टैक कार्यक्षमता को लागू करने का एक अच्छा तरीका क्या होगा?

मुझे समर्थन करने की आवश्यकता है:

  • पुश (फ़ाइल का नाम, उपयोगकर्ता): उपयोगकर्ता के लिए एक फ़ाइल का नाम रखें
  • पॉप (उपयोगकर्ता): उपयोगकर्ता के लिए सबसे अधिक फ़ाइल नाम बदलें

संपादित करें :

मैं एक विचार का प्रोटोटाइप बना रहा हूं, और इसलिए मैं अजगर के साथ sqlite3 का उपयोग कर रहा हूं।

धन्यवाद!


क्या आप एक ही उपयोगकर्ता से कई समवर्ती कनेक्शन की उम्मीद करते हैं? क्या संस्करणों? क्या डीबी इंजन भी कृपया?
gbn

@ जीबी अंत में एक ही उपयोगकर्ता समवर्ती कनेक्शन हो सकता है। लेकिन अब के लिए, मैं एक विचार का प्रोटोटाइप बना रहा हूं और मैं प्रति उपयोगकर्ता एकल कनेक्शन ग्रहण करता हूं
ब्रेनडेक्सटर

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

@xenoterracide: मैं SO पर जो करने की कोशिश कर रहा हूं उसका समग्र आशय: stackoverflow.com/questions/5145051/… स्टैक पूरी तरह से काम नहीं करता था, इसलिए मैं अभी भी इसके समाधान की तलाश में हूं।
ब्रेनडेक्सटर

1
@brainydexter वास्तव में आश्चर्यचकित नहीं है, एसक्यूएल एक स्टैक को लागू करने के लिए एक भयानक भाषा है, क्योंकि संबंधपरक परिभाषा के अनुसार एक सेट अनियंत्रित है, इसलिए आपके स्टैक का कोई आदेश नहीं होगा, और आपको इसे सॉर्ट करना होगा। शायद आपकी समस्या का हिस्सा आप लोगों को बता रहे हैं कि आप क्या जवाब चाहते हैं, और आप पूछ रहे हैं कि कैसे। यह बताने के बजाय कि समस्या क्या है, और क्या पूछ रही है। यहां तक ​​कि आपका एसओ प्रश्न कुछ विशिष्ट के उत्तर की ओर जाता है। उस समाधान के लिए पूछने का प्रयास करें जिसके बारे में आप नहीं सोचेंगे।
xenoterracide

जवाबों:


6

यदि आप इस बारे में पूछ रहे हैं कि किस डेटाबेस का उपयोग करना है, तो यह वास्तव में व्यक्तिगत पसंद पर निर्भर करता है और आप इससे क्या चाहते हैं। जैसा कि मैं केवल MySQL से परिचित हूं, मैं MySQL मानने वाले प्रश्न के दूसरे भाग का उत्तर दूंगा:

आप उपयोग करना चाहते हैं INNODBक्योंकि आपकी तालिका लेखन-गहन होने वाली है और बड़ी तालिकाओं के लिए, INNODB की पंक्ति-लॉकिंग जीवन-रक्षक होगी MyISAM

जहाँ तक टेबल डिज़ाइन की बात है, ऐसा लगता है कि आपको वास्तव में केवल एक टेबल की आवश्यकता है:

CREATE TABLE `wordpress`.`<table_name>` (
`id` smallint(4) NOT NULL AUTO_INCREMENT UNSIGNED,
`user` varchar(30) NOT NULL,
`filename` varchar(255) NOT NULL,
`date_insert` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE `userFile`(user, filename)
) ENGINE=`InnoDB`;

मैं एक अनियंत्रित 'आईडी' कॉलम सेट के साथ गया AUTO_INCREMENTक्योंकि प्राथमिक कुंजी को प्रत्येक सूचकांक के प्रत्येक प्रविष्टि में दोहराया गया है। तो, (उपयोगकर्ता, फ़ाइल नाम) की एक प्राथमिक कुंजी करने से यदि आपके फ़ाइलनाम बहुत लंबे हैं, तो प्रदर्शन संबंधी समस्याएं हो सकती हैं।

आपकी 'आईडी' कॉलम का आकार इस बात पर निर्भर करता है कि आपकी तालिका कितनी बड़ी होने जा रही है। अनसाइनड स्मॉलिंट आपको 65k रो देगा।

उपयोगकर्ता और फ़ाइल नाम varchar हैं, क्योंकि वे लंबाई पर अलग-अलग होंगे जो मुझे लगता है।

date_insertसिर्फ एक है जब यह डाला गया था (अपनी POP के लिए उपयोगी) के आधार पर अपनी ऑर्डर करने के लिए रास्ता है


मैं प्राथमिक आईडी के रूप में (आईडी, उपयोगकर्ता) संयोजन बनाने के बारे में सोच रहा था, क्योंकि मैं उपयोगकर्ता के आधार पर पुश या पॉप करना चाहता हूं। तुम क्या सोचते हो ? इसके अलावा, पीओपी ऑपरेशन के लिए, अधिकतम आईडी वाले उपयोगकर्ता के लिए रिकॉर्ड ढूंढना बेहतर नहीं होगा?
ब्रेनडेक्सटर

@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html के पास स्वप्रमाणन पर कुछ प्रतिबंध हैं (यह कुछ दुर्लभ मामलों में 'निचले' स्वपोषित मान का पुन: उपयोग करेगा)। क्योंकि यह संभावना है कि मैं एक date_insert क्षेत्र के साथ गया था। प्राथमिक कुंजी के रूप में (आईडी, उपयोगकर्ता) का उपयोग करने के लिए, अधिक भंडारण लेने के अलावा कोई मतलब नहीं है। ID विशिष्ट रूप से पंक्ति की पहचान करता है। केवल 'उपयोगकर्ता' अपने आप में पंक्ति की पहचान नहीं करता है, इसलिए यदि आप चाहते हैं तो आप एक अद्वितीय (उपयोगकर्ता, फ़ाइल नाम) के बजाय 'यूज़रआईडी' पर एक गैर-अद्वितीय सूचकांक रख सकते हैं।
डेरेक डाउनी

6

यदि आप एक ओरेकल डेटाबेस पर विचार कर रहे हैं, तो आपको एक एलआईएफओ के साथ उन्नत कतार का उपयोग करने पर विचार करना चाहिए (आखिरी में पहले) डीक्यू पैटर्न

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


क्लासिक निर्माता / उपभोक्ता सेटअप। जानकारी के लिए धन्यवाद, मैं इसे ध्यान में रखूंगा।
ब्रेनडेक्सटर

उम्मीद है कि MySQL को अब कुछ Adance Que कार्यक्षमता मिल जाएगी, जो कि Oracle "mysql" का मालिक है ...
डेरेक डाउनी

1
@Dest: निश्चित रूप से, इस बात की भी अलग संभावना है कि mySQL के अब एडवांस फीचर्स मिलने की संभावना कम है, इसलिए Oracle मुफ्त सॉफ्टवेयर और आपके द्वारा भुगतान किए जाने के बीच अंतर कर सकता है।
जो

@ जो सोचा था के साथ मेरे सप्ताहांत को बर्बाद करने के लिए धन्यवाद!
डेरेक डाउनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.