বন্ধুত্বের সম্পর্ক সঞ্চয় করতে কীভাবে কোনও সম্পর্কের ডাটাবেস সারণি ডিজাইন করবেন?


9

আমি আমার ওয়েব প্রকল্পে বন্ধুত্বের সম্পর্ক সঞ্চয় করতে একটি টেবিল ডিজাইন করতে চাই

এটি কমপক্ষে নিম্নলিখিত 4 শর্ত পূরণ করতে হবে:

অ্যাড-ফ্রেন্ড রিকোয়েস্ট কে প্রেরণ করেন যেমন (যদি একটি টো বি হয় তবে এই কলামটি হবে A)

যারা অ্যাড-ফ্রেন্ড রিকোয়েস্ট গ্রহণ করে যেমন (যদি একটি টো বি হয় তবে এই কলামটি বি হবে)

বর্তমান স্থিতি যেমন (0 টি প্রত্যাখাত হয়েছে যেখানে 1 টি স্বীকৃত বা 2 টি প্রনালীবিহীন হিসাবে চিহ্নিত করা হয়েছে

আমাদের বন্ধুত্বপূর্ণ সম্পর্ক দ্বিপক্ষীয়

আপনার যদি কেউ এটির সাথে অভিজ্ঞ হন তবে কোনও পরামর্শই স্বাগত

আমার বর্তমান নকশা (আমি এখনই খারাপ বলে মনে করি) এটি কলামগুলির মতো

frienshipId  
fromUserId  
toUserId  
status  
requestTime

আমি কি কোড ভিউটি ব্যবহার করে (আপনার পাঠ্যকে হাইলাইট করুন এবং সিআরটিএল-কে টিপুন বা প্রতিটি লাইনের আগে চারটি স্পেস রেখে দিন) এবং আপনার ডিডিএল হাইলাইট করতে পারি যাতে আমরা দেখতে পারি যে কীভাবে আপনার ডেটা মডেলটি ডিজাইন করা হয়েছে (বা আপনি এটি কীভাবে ডিজাইন করতে চান)
jcolebrand

এছাড়াও এখানে আলোচনাটি পরীক্ষা করুন: stackoverflow.com/questions/10807900/…
ফ্লো

একটি গ্রাফ ডাটাবেস ব্যবহার করুন। এগুলি কেবল এই পরিস্থিতিতে তৈরি করা হয়েছে।
মাইকেল গ্রিন

উত্তর:


9

আমি আপনার মতো একটি টেবিল তৈরি করব। আমি এসকিউএল সার্ভার ডেটা টাইপ এবং সিনট্যাক্স ব্যবহার করছি, আপনার প্ল্যাটফর্মের উপর নির্ভর করে আপনার টুইঙ্কের প্রয়োজন হতে পারে।

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

টেবিলটি দশক এবং কয়েক মিলিয়নতে বেড়ে যাওয়ার সাথে সাথে সারণির সূচীটি গুরুত্বপূর্ণ হবে।


স্ট্যাটাসআইডির একটি ক্লাস্টারড ইনডেক্স / প্রাথমিক কী সম্পর্কে কী?
bernd_k

সদৃশ নাম ইস্যু স্থির। ক্লাস্টারড সূচকটি ফ্রেন্ডস্ট্যাটাসআইডিতে থাকা উচিত। প্রাথমিক কীটি ফ্রেন্ডস্ট্যাটাসআইডি বা ফরোউজারআইডি এবং টুউজারআইডির সংমিশ্রণ হতে পারে।
mrdenny

যদিও আপনি একাধিক বন্ধু অনুরোধের অনুমতি দিলে আপনি প্যাকে ইউজারআইডিআইডি, টুউজারআইডি, সেন্টেন্টাইম বা ক্লাস্টার ইনডেক্সে চাইবেন।
mrdenny

আপনার নামকরণ কৌশলটি আরও ভাল ...
হাই 福气 鱼

8

পোস্টগ্র্যাস এসকিউএল এ:

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

আপনার বর্তমান ডিজাইনটি খারাপ মনে করে কি? এখানে ওরাকলের জন্য একটি তৈরি টেবিল রয়েছে:

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 নামে একটি ভার্চুয়াল কলাম থাকতে পারে যা ডিকোড (স্ট্যাটাসআইডি, 1, ফর্ম ইউজারআইডি, এনইউএল) ব্যবহার করে। সূচকটিতে কেবল AcceptedUserIds থাকতে পারে এবং তাই সমস্ত ব্যবহারকারীর জন্য একটি সূচকের চেয়ে ছোট হবে। যদি আপনি নিয়মিত প্রত্যাখ্যাত অনুরোধগুলি সাফ করে দেন তবে পেন্ডিং টোইউসারআইডিতে একটি ইনডেক্স ভার্চুয়াল কলামটি আরও কার্যকর হতে পারে।

আপনার বিভাজন থাকলে বিকল্পটি হ'ল স্থিতি আইডির টেবিলটি বিভাজন করা।

যদি একই সময়ে একই ব্যবহারকারীর মধ্যে একাধিক বন্ধু অনুরোধের প্রয়োজন না হয় তবে আপনি নিজের প্রাথমিক কী হিসাবে থেকে ইউজারআইডি, টুউজারআইডি, এবং স্ট্যাটাসআইড ব্যবহার করে ফ্রেন্ডআইডকে ত্যাগ করতে পারেন। এক্ষেত্রে আপনার সারণিকে একটি সূচক সংগঠিত টেবিল তৈরি করার বিষয়টিও বিবেচনা করা উচিত।


-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
)

পিএইচপি থেকে:

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

আর পারস্পরিকতা নিয়ে কী করবেন? (এবং friendsটেবিলের সংজ্ঞাটি সিনট্যাক্স ত্রুটির জন্য সন্দেহজনক))
দেজো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.