फ्रेंडशिप रिलेशनशिप को स्टोर करने के लिए रिलेशनशिप डेटाबेस टेबल कैसे डिजाइन करें?


9

मैं अपने वेब प्रोजेक्ट में दोस्ती के रिश्ते को स्टोर करने के लिए एक टेबल डिजाइन करना चाहता हूं

इसे कम से कम निम्नलिखित 4 शर्तों को पूरा करना चाहिए:

जो ऐड-फ्रेंड रिक्वेस्ट भेजते हैं जैसे (अगर ए टू बी तो यह कॉलम ए होगा)

ऐड-फ्रेंड रिक्वेस्ट किसको मिलती है (यदि A TO B है तो यह कॉलम B होगा)

वर्तमान स्थिति उदा। (0 निरूपित अस्वीकृत जबकि 1 निरूपित स्वीकार करता है या 2 अकारण निरूपित करता है

हमारा मित्र संबंध द्विपक्षीय है

यदि आप में से कोई भी इसके साथ अनुभव करता है, तो किसी भी सुझाव का स्वागत किया जाता है

मेरा वर्तमान डिज़ाइन (मुझे लगता है कि अभी बुरा है) इस तरह ये कॉलम हैं

frienshipId  
fromUserId  
toUserId  
status  
requestTime

क्या मैं कोड दृश्य का उपयोग करने का सुझाव दे सकता हूं (अपने पाठ को हाइलाइट करें और ctrl-k दबाएं या प्रत्येक पंक्ति से पहले चार रिक्त स्थान डालें) और आपके डीडीएल को हाइलाइट करें ताकि हम देख सकें कि आपका डेटा मॉडल कैसे बनाया गया है (या आप इसे कैसे डिज़ाइन करना चाहते हैं)
jcoleband

यहां भी चर्चा की जांच करें: stackoverflow.com/questions/10807900/…
फ़्लो

एक ग्राफ डेटाबेस का उपयोग करें। ये सिर्फ इस परिस्थितियों के लिए डिज़ाइन किए गए हैं।
माइकल ग्रीन

जवाबों:


9

मेरे पास एक मेज है, जो आपके पास है। मैं SQL सर्वर डेटा प्रकार और सिंटैक्स का उपयोग कर रहा हूं, आपको अपने प्लेटफॉर्म के आधार पर ट्वीक करने की आवश्यकता हो सकती है।

CREATE TABLE FriendStatus
(FriendStatusId BIGINT PRIMARY KEY IDENTITY(1,1),
FromUserId BIGINT,
ToUserId BIGINT,
StatusId TINYINT,
SentTime DATETIME2,
ResponseTime DATETIME2);

तालिका का अनुक्रमण महत्वपूर्ण होगा क्योंकि तालिका दसियों और लाखों लोगों तक बढ़ती है।


StatusId पर एक संकुल सूचकांक / प्राथमिक कुंजी के बारे में क्या?
bernd_k

डुप्लिकेट नाम समस्या फिक्स्ड। Clustered Index FriendStatusId पर होना चाहिए। प्राथमिक कुंजी FriendStatusId या FromUserId और ToUserId का संयोजन हो सकता है।
मर्देनी

यद्यपि यदि आप कई मित्र अनुरोधों की अनुमति देते हैं तो आप FromUserID, ToUserId, SentTime या Clustered सूचकांक पर PK चाहेंगे।
mrdenny

आपकी नामकरण की रणनीति बेहतर है ...
हाय aming '

8

PostgreSQL पर:

CREATE TABLE users (
    users_id serial PRIMARY KEY,
    name text UNIQUE NOT NULL
);

CREATE TABLE friends (
    friends_id serial PRIMARY KEY,
    timestamp TIMESTAMPTZ default now(),
    user_a integer NOT NULL REFERENCES users,
    user_b integer NOT NULL REFERENCES users,
    status integer NOT NULL default 2
)

मित्रता सूचीबद्ध करने के लिए, एक दृश्य:

CREATE VIEW friendships AS
    SELECT DISTINCT user_a, user_b FROM friends WHERE status = 1
    UNION
    SELECT DISTINCT user_b, user_a FROM friends WHERE status = 1;

आप इसे इस तरह से उपयोग कर सकते हैं:

INSERT INTO users ( name ) VALUES ( 'foo' );
INSERT INTO users ( name ) VALUES ( 'bar' );
INSERT INTO users ( name ) VALUES ( 'baz' );

SELECT * FROM users;
 users_id | name 
----------+------
        1 | foo
        2 | bar
        3 | baz

INSERT INTO FRIENDS ( user_a, user_b, status ) VALUES ( 1, 2, 1 );
INSERT INTO FRIENDS ( user_a, user_b, status ) VALUES ( 2, 1, 1 );
INSERT INTO FRIENDS ( user_a, user_b, status ) VALUES ( 1, 3, 1 );

SELECT * FROM friendships ORDER BY user_a, user_b;
 user_a | user_b 
--------+--------
      1 |      2
      1 |      3
      2 |      1
      3 |      1

SELECT a.name, b.name
    FROM friendships
    JOIN users a ON a.users_id = user_a
    JOIN users b ON b.users_id = user_b
    ORDER BY a.name, b.name;
 name | name 
------+------
 bar  | foo
 baz  | foo
 foo  | bar
 foo  | baz

3

क्या आपको लगता है कि आपका वर्तमान डिजाइन खराब है? यहाँ Oracle के लिए एक तालिका बनाएँ:

CREATE TABLE IVR.FRIEND (
     FRIENDID   NUMBER(7) NOT NULL 
   , FROMUSERID NUMBER(7) NOT NULL 
   , TOUSERID   NUMBER(7) NOT NULL 
   , STATUSID   NUMBER(2) NOT NULL
   , REQUESTED  DATE      NOT NULL 
   , CONSTRAINT FRIEND_PK PRIMARY KEY (FRIENDID) ENABLE 
);
CREATE SEQUENCE FRIENDIDSEQ;

यदि डेटाबेस ओरेकल है, तो आप एक अनुक्रमित आभासी कॉलम पर विचार करना चाह सकते हैं जो डेटा को विशेष प्रश्नों के लिए आवश्यक प्रविष्टियों तक सीमित कर देगा। उदाहरण के लिए, आपके पास एक वर्चुअल कॉलम हो सकता है जिसे AcceptedFromUserId कहा जाता है जो फ़ंक्शन DECODE (StatusId, 1, FromUserId, NULL) का उपयोग करता है। सूचकांक में केवल AcceptedUserIds शामिल होगा और इसलिए सभी UserIds के लिए एक सूचकांक से छोटा होगा। यदि आप नियमित रूप से अस्वीकार किए गए अनुरोधों को साफ़ करते हैं तो PendingToUserId पर एक अनुक्रमित आभासी कॉलम अधिक उपयोगी हो सकता है।

यदि आपके पास विभाजन है तो एक विकल्प StatusId पर तालिका को विभाजित करना होगा।

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


-2

स्कीमा:

CREATE TABLE users (
    users_id serial PRIMARY KEY,
    name text UNIQUE NOT NULL
);

CREATE TABLE friends (
    friends_id serial PRIMARY KEY,
    timestamp TIMESTAMPTZ default now(),
    user_a integer NOT NULL REFERENCES users,
    user_b integer NOT NULL REFERENCES users,
    status integer NOT NULL default 2
)

PHP से:

select * 
from friends 
where user_a=$myid or user_b=$myid

और पारस्परिकता के साथ क्या करना है? (और friendsतालिका की परिभाषा वाक्यविन्यास त्रुटि के लिए संदिग्ध है।)
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.