सवाल Mysql में सरणी को कैसे स्टोर करें?


क्या mysql फ़ील्ड में सरणी को स्टोर करने का कोई तरीका है? मैं एक टिप्पणी रेटिंग प्रणाली बना रहा हूं इसलिए मैं कई वोटिंग रोकने के लिए उपयोगकर्ता आईडी के सरणी स्टोर करना चाहता हूं। मैं नई तालिका बनाने जा रहा हूं जिसमें टिप्पणी आईडी और उपयोगकर्ता आईडी की सरणी है जिसने इस टिप्पणी पर मतदान किया है। मैं टिप्पणी तालिका और इस तालिका में शामिल हो जाऊंगा और जांच सकता हूं कि वर्तमान उपयोगकर्ता आईडी मतदाता सरणी या नोट में मौजूद है या नहीं। यदि मतदान आइकन से यह किया जाता है तो यह अक्षम कर दिया जाएगा। मुझे लगता है कि मैं इस तरह से लूप में mysql क्वेरी का उपयोग करने से रोकूंगा।

क्या आपको किसी भी बेहतर तरीके से पता चल रहा है?


44
2017-08-05 09:16


मूल


मुझे पता है कि एक उपयोगकर्ता से कई मतदाताओं को रोकने के लिए यह एक आसान काम है, लेकिन मुझे उन उपयोगकर्ताओं के लिए अक्षम आइकन प्रदर्शित करने की आवश्यकता है जो पहले से ही विशेष टिप्पणी पर मतदान कर चुके हैं और जितना संभव हो उतने mysql प्रश्नों का उपयोग करते हैं। जैसा कि मैंने देखा है serialize समारोह इस समस्या को संभालेगा ... - King Julien
क्या कोई कारण है कि आपको लगता है कि यदि आप सामान्यीकृत दृष्टिकोण का उपयोग करना चाहते हैं तो यह मुश्किल होगा? - Daniel Vassallo
@ Daniel Vassallo सामान्यीकृत दृष्टिकोण में आपका क्या मतलब है? - King Julien
यह दृष्टिकोण है कि @ पेक्का, @ बोर्न, @ डेनिस, और मैंने जवाब में सुझाव दिया है। हम मूल रूप से एक रिश्ते को स्टोर करने के लिए एक और तालिका (एक चौराहे तालिका कहा जाता है) का उपयोग करने के पक्ष में, एक डेटाबेस क्षेत्र में एक सरणी क्रमबद्ध करने के खिलाफ सुझाव दे रहे हैं। उत्तरों में अधिक जानकारी :) - Daniel Vassallo
के संभावित डुप्लिकेट MySQL में सरणी - outis


जवाब:


आप हमेशा सरणी को क्रमबद्ध कर सकते हैं और डेटाबेस में स्टोर कर सकते हैं।
PHP Serialize

आवश्यकता होने पर आप सरणी को फिर से बेअसर कर सकते हैं।


47
2017-08-05 09:19



यह संबंधपरक मॉडल तोड़ता है। - outis
यह मेरी स्थिति के लिए बिल्कुल सही था। बस उपयोगकर्ता सेटिंग्स के लिए एक चर सरणी स्टोर करने की कोशिश कर रहा है। धन्यवाद अनुदान। - CA3LE
इस डेटा के बाद आप इस डेटा तक पहुंचने के तरीके के आधार पर अधिक समझ सकते हैं। यदि आपको एक समय में सरणी से एक विशेष आइटम की आवश्यकता नहीं है, लेकिन केवल पूरी सरणी (जो मैं चाहता था) यह समाधान ठीक है। - King Julien
सीरियलाइजिंग खराब अभ्यास है ... डीबी को पढ़ने या लिखने के लिए तीसरे पक्षों के आधार पर माइग्रेशन के लिए यह बहुत कम पोर्टेबल खुला है। जैसा कि कहा गया है कि यह एक डीबी के मॉडल को हरा देता है। यदि यह आवश्यक है तो json_encode बेहतर समाधान हो सकता है क्योंकि यह तेज़ लगता है। यह खोजों और प्रश्नों को भी प्रस्तुत करता है और बहुत अधिक हेवर और कड़ी मेहनत करता है। यदि सरणी छोटे होते हैं और विस्फोट बहुत अच्छी तरह से काम करेंगे। - Yann Poiré


आप इस प्रकार से निपटने के लिए निम्नानुसार हो सकता है:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id)
);

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id)
);

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id)
);

समग्र प्राथमिक कुंजी  (comment_id, user_id) पर चौराहे की मेज  comments_votes उपयोगकर्ताओं को एक ही टिप्पणी पर कई बार मतदान करने से रोक देगा।

आइए उपर्युक्त स्कीमा में कुछ डेटा डालें:

INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');

INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');

अब उपयोगकर्ता 1 के लिए कुछ वोट जोड़ें:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);

उपर्युक्त का अर्थ है कि उपयोगकर्ता 1 ने टिप्पणी 1 और 2 पर टाइप 1 का वोट दिया था।

यदि वही उपयोगकर्ता उन टिप्पणियों में से किसी एक पर फिर से मतदान करने का प्रयास करता है, तो डेटाबेस इसे अस्वीकार कर देगा:

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

यदि आप इसका उपयोग करेंगे InnoDB भंडारण इंजन, यह भी उपयोग करने के लिए बुद्धिमान होगा विदेशी कुंजी पर बाधाएं comment_id तथा user_id चौराहे की मेज के क्षेत्र। हालांकि ध्यान दें कि MyISAM, MySQL में डिफ़ॉल्ट स्टोरेज इंजन, विदेशी कुंजी बाधाओं को लागू नहीं करता है:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id)
) ENGINE=INNODB;

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id)
) ENGINE=INNODB;

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id),
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
    FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;

ये विदेशी कुंजी गारंटी देते हैं कि एक पंक्ति में comments_votes कभी नहीं होगा comment_id या user_id वह मान जो अस्तित्व में नहीं है comments तथा users क्रमशः टेबल। विदेशी कुंजियों के लिए एक कामकाजी संबंधपरक डेटाबेस होना जरूरी नहीं है, लेकिन वे टूटे रिश्तों और अनाथ पंक्तियों (यानी) से बचने के लिए निश्चित रूप से आवश्यक हैं। निर्देशात्मक अखंडता)।

वास्तव में, रेफरेंशियल अखंडता ऐसी चीज है जो लागू करने में बहुत मुश्किल होती अगर आप धारावाहिक सरणी को एक डेटाबेस फ़ील्ड में स्टोर करना चाहते थे।


57
2017-08-05 09:23



यह एक मान्य उत्तर होना चाहिए। - tomsihap


तालिका संरचना को टिप्पणियों में सामान्यीकृत करने और एक अलग वोट तालिका पर विचार करें।

तालिका "टिप्पणियां":

id
comment
user
...

तालिका "वोट":

user_id  
comment_id
vote (downvote/upvote)

यह किसी डेटाबेस फ़ील्ड की सीमाओं के बिना असीमित वोटों की अनुमति देगा।

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


13
2017-08-05 09:20



ओपी के सवाल का पूरा बिंदु, शायद कई तालिकाओं का उपयोग करने से बचने के लिए है। - user18490


आपके पास तीन टेबल होनी चाहिए: उपयोगकर्ता, टिप्पणियां और टिप्पणी_उज़र।

comment_users में केवल दो फ़ील्ड हैं: fk_user_id और fk_comment_id

इस तरह आप अपना प्रदर्शन अधिकतम तक रख सकते हैं :)


4
2017-08-05 09:19





मैं आपकी टेबल संरचना को सामान्य बनाना पसंद करूंगा, कुछ ऐसा;

COMMENTS
-------
id (pk)
title
comment
userId


USERS
-----
id (pk)
name
email


COMMENT_VOTE
------------
commentId (pk)
userId (pk)
rating (float)

अब इसे बनाए रखना आसान है! और MySQL केवल प्रति उपयोगकर्ता एक टिप्पणी और टिप्पणी स्वीकार करते हैं।


4
2017-08-05 09:21





इस तरह की टेबल बनाएं,

CommentId    UserId
---------------------
   1            usr1
   1            usr2

इस तरह आप जांच सकते हैं कि उपयोगकर्ता ने टिप्पणियां पोस्ट की हैं या नहीं .. इसके अलावा टेबल के लिए टेबल होना चाहिए Comments तथा Users संबंधित आईडी के साथ


1
2017-08-05 09:22





यदि आप डेटा को डेटाबेस में संग्रहीत करते हैं तो आप चाहते हैं कि आप इसे मैन्युअल रूप से सरणी में डाल रहे हों

"INSERT INTO database_name.database_table (`array`)
    VALUES
    ('One,Two,Three,Four')";

फिर जब आप डेटाबेस से खींच रहे हैं, तो विस्फोट () फ़ंक्शन का उपयोग करें

$sql = mysql_query("SELECT * FROM database_name.database_table");
$numrows = mysql_num_rows($sql);
if($numrows != 0){
    while($rows = mysql_fetch_assoc($sql)){
        $array_from_db = $rows['array'];
    }
}else{
    echo "No rows found!".mysql_error();
}
$array = explode(",",$array_from_db);
foreach($array as $varchar){
    echo $varchar."<br/>";
}

इस तरह!


1
2018-02-19 00:03





के साथ भंडारण json या धारावाहिक सरणी अब के लिए सबसे अच्छा समाधान है। कुछ स्थितियों ("अक्षर को ट्रिम करना) के साथ जेसन को परेशानी हो रही है लेकिन सीरियलाइज बहुत अच्छा विकल्प होना चाहिए।

नोट: यदि आप मैन्युअल रूप से क्रमबद्ध डेटा बदलते हैं, तो आपको चरित्र गणना के बारे में सावधान रहना होगा।


0
2017-08-06 00:15





आप MySQL में सरणी स्टोर करने के लिए php serialize फ़ंक्शन का उपयोग कर सकते हैं।

<?php

$array = array("Name"=>"Shubham","Age"=>"17","website"=>"http://mycodingtricks.com");

$string_array = serialize($array);

echo $string_array;

?>

यह आउटपुट होगा:

a:3{s:4:"Name";s:7:"Shubham";s:3:"Age";s:2:"17";s:7:"website";s:25:"http://mycodingtricks.com";}

और फिर आप डेटा को डीकोड करने के लिए php unserialize फ़ंक्शन का उपयोग कर सकते हैं।

मुझे लगता है कि आपको जाना चाहिए mysql में सरणी संग्रहीत करने पर यह पृष्ठ


0
2017-12-07 14:51



लिंक मर चुका है - phpN00b