ออกแบบฐานข้อมูล Facebook?


133

ฉันสงสัยมาตลอดว่า Facebook ออกแบบความสัมพันธ์กับผู้ใช้ของเพื่อน <-> อย่างไร

ฉันคิดว่าตารางผู้ใช้เป็นดังนี้:

user_email PK
user_id PK
password 

ฉันคิดว่าตารางที่มีข้อมูลของผู้ใช้ (เพศอายุ ฯลฯ ที่เชื่อมต่อผ่านอีเมลผู้ใช้ฉันจะถือว่า)

มันเชื่อมต่อเพื่อนทั้งหมดกับผู้ใช้นี้อย่างไร?

อะไรทำนองนี้?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

อาจจะไม่. เนื่องจากไม่ทราบจำนวนผู้ใช้และจะขยายออกไป


13
มีหน้า Facebook Engineering ที่มีข้อมูลประเภทนี้มากมาย แต่ไม่ค่อยมีอะไรให้คุณถาม คุณอาจต้องการถามที่นั่นและดูว่าคุณจะได้รับคำตอบหรือไม่ facebook.com/FacebookEngineering
John Meagher

1
graph databaseGoogle แน่นอนว่าไม่ใช่ RDBMS

คำตอบ:


90

เก็บตารางเพื่อนที่มี UserID และ UserID ของเพื่อน (เราจะเรียกว่า FriendID) คอลัมน์ทั้งสองจะเป็นคีย์ต่างประเทศกลับไปที่ตารางผู้ใช้

ตัวอย่างที่มีประโยชน์:

Table Name: User
Columns:
    UserID PK
    EmailAddress
    Password
    Gender
    DOB
    Location

TableName: Friends
Columns:
    UserID PK FK
    FriendID PK FK
    (This table features a composite primary key made up of the two foreign 
     keys, both pointing back to the user table. One ID will point to the
     logged in user, the other ID will point to the individual friend
     of that user)

ตัวอย่างการใช้งาน:

Table User
--------------
UserID EmailAddress Password Gender DOB      Location
------------------------------------------------------
1      bob@bob.com  bobbie   M      1/1/2009 New York City
2      jon@jon.com  jonathan M      2/2/2008 Los Angeles
3      joe@joe.com  joseph   M      1/2/2007 Pittsburgh

Table Friends
---------------
UserID FriendID
----------------
1      2
1      3
2      3

สิ่งนี้จะแสดงให้เห็นว่าบ็อบเป็นเพื่อนกับทั้งจอนและโจและจอนก็เป็นเพื่อนกับโจด้วย ในตัวอย่างนี้เราจะถือว่ามิตรภาพมีสองทางเสมอดังนั้นคุณไม่จำเป็นต้องมีแถวในตารางเช่น (2,1) หรือ (3,2) เพราะมันแสดงไปในทิศทางอื่นแล้ว สำหรับตัวอย่างที่มิตรภาพหรือความสัมพันธ์อื่น ๆ ไม่ใช่สองทางอย่างชัดเจนคุณจะต้องมีแถวเหล่านั้นเพื่อระบุความสัมพันธ์สองทาง


8
ลองคิดดูว่าสิ่งนี้ไม่มีประสิทธิภาพเพียงใด - คุณต้องทำแบบสอบถามที่ไม่ต่อเนื่องในคอลัมน์ของจำนวนมากถึงหลายคนโดยเพิ่มเวลาในการค้นหาโดยเฉลี่ยเป็นสองเท่า
Anthony Bishopric

2
โดยส่วนตัวแล้วฉันไม่ต้องการให้สองช่องนี้สร้างคีย์หลักแบบผสม คีย์ที่ไม่เหมือนใครอย่างแน่นอน ดัชนีคลัสเตอร์ของคีย์เฉพาะนั้นแน่นอน แต่ฉันยังใส่เอกลักษณ์ที่ไม่ใช่คอมโพสิตบางประเภทเป็น PK ที่มีดัชนีที่ไม่ใช่คลัสเตอร์ ซึ่งจะช่วยให้ตารางอื่น ๆ ที่ต้องใช้ "รหัสความสัมพันธ์แบบเพื่อน" FK เชื่อมโยงกับตารางนี้ได้อย่างง่ายดายและทริกเกอร์ต่างๆอาจทำให้เกิดเหตุการณ์การผูกมิตรการทำให้เสียมิตร ฯลฯ
Jesse C. Slicer

1
กล่าวว่า Facebook มีผู้ใช้ประมาณ 1'000'000'000 คน หากผู้ใช้โดยเฉลี่ยมีเพื่อน 100 คนนั่นหมายความว่าตารางจะมีแถว 100'000'000'000 แบ่ง MySQL?
veidelis

ลืมแนวทางนี้ หากคุณมีผู้ใช้จำนวนมากแน่นอนมันจะกลายเป็นช้ามาก ดูคำตอบของฉันและลองเปรียบเทียบด้วยตัวคุณเอง ฉันได้ทำการเปรียบเทียบกับผู้ใช้ 10,000 คนและการเชื่อมต่อมิตรภาพ 2.5 ล้านครั้งและผลลัพธ์ก็น่าผิดหวัง หากคุณดำเนินการชุมชนขนาดเล็กก็จะทำงานได้ดี แต่มีปัญหาด้านประสิทธิภาพที่ต้องพิจารณา
burzum

7
คุณสามารถมั่นใจได้ว่า facebook ไม่ได้ใช้ RDBMS สำหรับสิ่งนี้เป็นความรู้ทั่วไปที่พวกเขา twitter และคนอื่น ๆ ที่ต้องการเรียกใช้แบบสอบถามเช่นนี้ใช้ฐานข้อมูลกราฟของรสชาติบางอย่าง มีอย่างน้อย 69 คนที่ไม่เคยทำงานในระดับใด ๆ หรือไม่รู้วิธีคิดเลข

51

ดูสคีมาฐานข้อมูลต่อไปนี้ซึ่งออกแบบโดย Anatoly Lubarsky :

สคีมาของ Facebook


7
นี่คือแผนภาพชั้นเรียนไม่ใช่สคีมาฐานข้อมูล
Lemon Juice

2
ดังนั้น "ผู้ใช้" แต่ละคนจะมีฐานข้อมูลเฉพาะของตัวเองหรือไม่ เหมือนข้างบนไหม มันจะทำงานอย่างไร? เช่นเมื่อผู้ใช้เข้าสู่ระบบ FB ตรวจสอบว่าเป็น User + Pass ที่ถูกต้องหรือไม่จากนั้น Facebook ที่ถูกต้องจะเปลี่ยนเส้นทางไปยังฐานข้อมูลที่นั่นซึ่งจะแสดงทุกอย่างจากฐานข้อมูลด้านบน
James111

นี้จัดเก็บเฉพาะข้อมูลที่เกี่ยวข้องกับผู้ใช้ฉันกำลังค้นหาโพสต์และผู้ชมโดยเฉพาะ?
Waseem Ahmad Naeem

47

TL; DR:

พวกเขาใช้สถาปัตยกรรมสแต็กที่มีกราฟแคชสำหรับทุกสิ่งที่อยู่เหนือ MySQL ด้านล่างของสแต็ก

คำตอบยาว:

ฉันทำการค้นคว้าเกี่ยวกับเรื่องนี้ด้วยตัวเองเพราะฉันอยากรู้ว่าพวกเขาจัดการกับข้อมูลจำนวนมหาศาลของพวกเขาอย่างไรและค้นหาด้วยวิธีที่รวดเร็ว ฉันเคยเห็นคนบ่นเกี่ยวกับสคริปต์โซเชียลเน็ตเวิร์กที่ทำขึ้นเองช้าลงเมื่อฐานผู้ใช้เติบโตขึ้น หลังจากที่ฉันทำการเปรียบเทียบตัวเองกับผู้ใช้เพียง 10kคนและการเชื่อมต่อกับเพื่อน 2.5 ล้านคน - ไม่ได้พยายามที่จะกังวลเกี่ยวกับการอนุญาตกลุ่มและการชอบและโพสต์บนผนัง แต่กลับกลายเป็นว่าแนวทางนี้มีข้อบกพร่องอย่างรวดเร็ว ดังนั้นฉันจึงใช้เวลาค้นหาเว็บเกี่ยวกับวิธีทำให้ดีขึ้นและเจอบทความทางการของ Facebook นี้:

ฉันจริงๆแนะนำให้คุณดูการนำเสนอของลิงค์แรกข้างต้นก่อนที่จะอ่านต่อ อาจเป็นคำอธิบายที่ดีที่สุดว่า FB ทำงานอย่างไรเบื้องหลังที่คุณสามารถหาได้

วิดีโอและบทความจะบอกคุณบางสิ่ง:

  • พวกเขาใช้ MySQL ที่ด้านล่างสุดของสแต็ก
  • เหนือ SQL DB มีเลเยอร์ TAO ซึ่งมีการแคชอย่างน้อยสองระดับและใช้กราฟเพื่ออธิบายการเชื่อมต่อ
  • ฉันไม่พบอะไรเลยเกี่ยวกับซอฟต์แวร์ / ฐานข้อมูลที่พวกเขาใช้สำหรับกราฟแคชของพวกเขา

ลองดูสิ่งนี้การเชื่อมต่อเพื่อนอยู่บนซ้าย:

ป้อนคำอธิบายภาพที่นี่

นี่คือกราฟ :) ไม่ได้บอกวิธีสร้างใน SQL มีหลายวิธีในการทำ แต่ไซต์นี้มีวิธีการที่แตกต่างกันมากมาย ข้อควรสนใจ:พิจารณาว่าฐานข้อมูลเชิงสัมพันธ์คืออะไร: คิดว่าจะจัดเก็บข้อมูลที่เป็นมาตรฐานไม่ใช่โครงสร้างกราฟ ดังนั้นมันจะทำงานได้ไม่ดีเท่ากับฐานข้อมูลกราฟเฉพาะ

พิจารณาด้วยว่าคุณต้องทำแบบสอบถามที่ซับซ้อนมากกว่าแค่เพื่อนของเพื่อนเช่นเมื่อคุณต้องการกรองสถานที่ทั้งหมดรอบพิกัดที่คุณและเพื่อนของคุณชอบ กราฟเป็นคำตอบที่สมบูรณ์แบบที่นี่

ฉันไม่สามารถบอกคุณได้ว่าจะสร้างมันอย่างไรจึงจะทำงานได้ดี แต่ต้องมีการลองผิดลองถูกและการเปรียบเทียบอย่างชัดเจน

นี่คือของฉันที่น่าผิดหวังสำหรับการทดสอบเพียงแค่เพื่อนผลการวิจัยของเพื่อน:

สคีมา DB:

CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

คำถามเพื่อนของเพื่อน:

(
        select friend_id
        from friends
        where user_id = 1
    ) union (
        select distinct ff.friend_id
        from
            friends f
            join friends ff on ff.user_id = f.friend_id
        where f.user_id = 1
    )

ฉันขอแนะนำให้คุณสร้างข้อมูลตัวอย่างโดยมีระเบียนผู้ใช้อย่างน้อย 10,000 รายการและแต่ละรายการมีการเชื่อมต่อกับเพื่อนอย่างน้อย 250 คนจากนั้นเรียกใช้แบบสอบถามนี้ ในเครื่องของฉัน (i7 4770k, SSD, 16gb RAM) ผลลัพธ์คือ~ 0.18 วินาทีสำหรับข้อความค้นหานั้น บางทีมันอาจจะปรับให้เหมาะสมฉันไม่ใช่ DB อัจฉริยะ (ยินดีรับข้อเสนอแนะ) อย่างไรก็ตามหากการปรับขนาดตามเส้นตรงแสดงว่าคุณอยู่ที่ 1.8 วินาทีสำหรับผู้ใช้เพียง 100,000 คน 18 วินาทีสำหรับผู้ใช้ 1 ล้านคน

สิ่งนี้อาจฟังดูโอเคสำหรับผู้ใช้ ~ 100,000 คน แต่ให้พิจารณาว่าคุณเพิ่งดึงเพื่อนของเพื่อนมาและไม่ได้ทำแบบสอบถามที่ซับซ้อนเช่น " แสดงเฉพาะโพสต์จากเพื่อนของเพื่อน + ตรวจสอบสิทธิ์ว่าฉันอนุญาตหรือไม่อนุญาต เพื่อดูบางส่วน + ทำแบบสอบถามย่อยเพื่อตรวจสอบว่าฉันชอบสิ่งใด " คุณต้องการให้ฐานข้อมูลตรวจสอบว่าคุณชอบโพสต์แล้วหรือไม่หรือคุณจะต้องทำโค้ด นอกจากนี้โปรดพิจารณาด้วยว่านี่ไม่ใช่คำค้นหาเดียวที่คุณเรียกใช้และคุณมีผู้ใช้ที่ใช้งานอยู่มากกว่าในเวลาเดียวกันบนไซต์ที่ได้รับความนิยมไม่มากก็น้อย

ฉันคิดว่าคำตอบของฉันตอบคำถามว่า Facebook ออกแบบความสัมพันธ์กับเพื่อนได้ดีแค่ไหน แต่ฉันขอโทษที่ฉันไม่สามารถบอกคุณได้ว่าจะใช้มันอย่างไรเพื่อให้ทำงานได้เร็ว การติดตั้งโซเชียลเน็ตเวิร์กเป็นเรื่องง่าย แต่การตรวจสอบให้แน่ใจว่าทำงานได้ดีนั้นไม่ชัดเจน - IMHO

ฉันได้เริ่มทดลองใช้ OrientDB เพื่อทำการสืบค้นกราฟและแมปขอบของฉันกับ SQL DB ถ้าฉันทำสำเร็จฉันจะเขียนบทความเกี่ยวกับเรื่องนี้


แล้ว .. คุณเคยเขียนบทความหรือไม่?
FlowUI SimpleUITesting.com

1
ไม่ฉันค่อนข้างยุ่งนอกเหนือจากการเขียนโปรแกรมและไม่มีเวลาและอารมณ์ที่จะทำ คำตอบที่นี่มีทุกสิ่งที่คุณจำเป็นต้องรู้หากคุณต้องการใช้การเชื่อมโยงเพื่อนที่มีประสิทธิภาพ แคชรายชื่อเพื่อนต่อผู้ใช้หรือแมปฐานข้อมูลเชิงสัมพันธ์ของคุณเป็นส่วน ๆ หรือทั้งหมดกับกราฟและค้นหา DB ของกราฟ คุณสามารถใช้ OrientDB หรือ Neo4j ได้ ฉันชอบที่จะเขียนซอฟต์แวร์เครือข่ายโซเชียลโอเพนซอร์สของตัวเอง แต่ก็มีสิ่งอื่น ๆ อีกมากมายที่ต้องทำเช่นกัน ไม่ว่าคุณจะทำอะไร: ทำเกณฑ์มาตรฐาน :)
burzum

ยังคงไม่. แต่เอกสาร OrientDB จะอธิบายถึงการเชื่อมต่อของเพื่อนและทุกอย่างสามารถจำลองได้เมื่อเข้าใจพื้นฐานแล้ว orientdb.com/docs/2.1/Tutorial-Working-with-graphs.htmlหากคุณต้องการใช้ฐานข้อมูลเชิงสัมพันธ์เป็นพื้นฐานคุณเพียงแค่ต้องเพิ่มโค้ดในการเรียกกลับ "after save" และ "after delete" เพื่ออัปเดต กราฟ DB (ซึ่งคุณจะใช้ในการอ่านข้อมูล) หากคุณไม่มีการเรียกกลับดังกล่าวให้ใช้ แต่ฉันเดาว่าการใช้งาน ORM และกรอบงานเกือบทุกประเภทมีบางอย่างเช่นนั้น จริงๆแล้ว OrientDB สามารถจัดเก็บเอกสารได้เช่นกัน
burzum

1
แล้ว .. คุณเคยเขียนบทความหรือไม่?
Connor Gurney

1
ยังไม่มี แต่เราทำสิ่งที่คล้ายกันในที่ทำงาน: เราแมปข้อมูลเชิงสัมพันธ์ของเรากับดัชนี Elastic Search ตามที่ฉันเขียนไว้ในความคิดเห็นของฉันก่อนหน้านี้มันเป็นเพียงเรื่องของการรับข้อมูลที่คุณต้องการจัดเก็บในดัชนีหรือกราฟหลังจากการกระทำ (afterSave () / afterDelete () เรียกกลับในกรณีของเรา) จากนั้นอัปเดตดัชนีหรือกราฟ ค่อนข้างเรียบง่าย? :) สามารถทำได้เช่นเดียวกันกับรายชื่อเพื่อนโดยวิธีนี้ไม่สำคัญว่าคุณจะเก็บไว้ใน ES กราฟหรือแคชตามหน่วยความจำ (ตราบใดที่คุณมี RAM เพียงพอ) มันไม่ยากจริงๆส่วนที่ยากคือการทำให้ทุกอย่างขยายขนาดเมื่อคุณเติบโต
burzum

32

ทางออกที่ดีที่สุดของฉันคือการที่พวกเขาสร้างโครงสร้างกราฟ โหนดคือผู้ใช้และ "มิตรภาพ" คือขอบ

เก็บตารางผู้ใช้ไว้หนึ่งโต๊ะเก็บขอบอีกตาราง จากนั้นคุณสามารถเก็บข้อมูลเกี่ยวกับขอบเช่น "วันที่พวกเขากลายมาเป็นเพื่อนกัน" และ "สถานะอนุมัติ" เป็นต้น


41
ฉันมีความรู้สึกว่าคุณจะต้องอธิบายอีกเล็กน้อยสำหรับบางคนที่นี่
TheTXI

4
ฉันคิดว่าคำถามที่น่าสนใจกว่าคือจะคงโครงสร้างขนาดใหญ่เช่นนี้ไว้ได้อย่างไร (เรากำลังพูดถึง 200 ล้านโหนดและขอบหลายพันล้าน) เพื่อให้สามารถค้นหาและอัปเดตได้อย่างง่ายดาย
Dirk Vollmar

1
@divo: การใช้ดัชนีและพาร์ติชันอย่างชาญฉลาด
belgariontheking

20

มักจะเป็นความสัมพันธ์แบบหลายต่อหลายคน:

FriendList (ตาราง)

user_id -> users.user_id
friend_id -> users.user_id
friendVisibilityLevel

แก้ไข

ตารางผู้ใช้อาจไม่มี user_email เป็น PK ซึ่งอาจเป็นคีย์เฉพาะ

ผู้ใช้ (ตาราง)

user_id PK
user_email
password

4
แม้ว่าสิ่งนี้จะสมเหตุสมผลที่สุด แต่ฉันคิดว่าประสิทธิภาพจะน่ากลัวเนื่องจากจำนวนผู้ใช้ Facebook และจำนวนเพื่อนของผู้ใช้ Facebook แต่ละคน
Kevin Pang

17

ดูบทความเหล่านี้ที่อธิบายถึงวิธีการสร้าง LinkedIn และ Digg:

นอกจากนี้ยังมี "Big Data: Viewpoints จากทีมข้อมูล Facebook" ที่อาจเป็นประโยชน์:

http://developer.yahoo.net/blogs/theater/archives/2008/01/nextyahoonet_big_data_viewpoints_from_the_fac.html

นอกจากนี้ยังมีบทความนี้ที่พูดถึงฐานข้อมูลที่ไม่ใช่เชิงสัมพันธ์และวิธีการใช้งานโดยบาง บริษัท :

http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php

คุณจะเห็นว่า บริษัท เหล่านี้กำลังจัดการกับคลังข้อมูลฐานข้อมูลที่แบ่งพาร์ติชันแคชข้อมูลและแนวคิดระดับสูงอื่น ๆ มากกว่าที่เราส่วนใหญ่ไม่เคยจัดการในแต่ละวัน หรืออย่างน้อยบางทีเราอาจไม่รู้ว่าเราทำ

มีลิงก์จำนวนมากในสองบทความแรกที่จะให้ข้อมูลเชิงลึกแก่คุณมากขึ้น

อัพเดท 10/20/2557

Murat Demirbasเขียนสรุปเกี่ยวกับ

  • TAO: ที่เก็บข้อมูลแบบกระจายของ Facebook สำหรับกราฟโซเชียล (ATC'13)
  • F4: ระบบจัดเก็บข้อมูล BLOB ที่อบอุ่นของ Facebook (OSDI'14)

http://muratbuffalo.blogspot.com/2014/10/facebooks-software-architecture.html

HTH


9

เป็นไปไม่ได้ที่จะดึงข้อมูลจาก RDBMS สำหรับข้อมูลเพื่อนผู้ใช้สำหรับข้อมูลที่ข้ามมากกว่าครึ่งพันล้านในเวลาคงที่ดังนั้น Facebook จึงใช้สิ่งนี้โดยใช้ฐานข้อมูลแฮช (ไม่มี SQL) และเปิดฐานข้อมูลที่เรียกว่า Cassandra

ดังนั้นผู้ใช้ทุกคนจึงมีคีย์ของตัวเองและรายละเอียดของเพื่อนในคิว หากต้องการทราบว่าคาสซานดราทำงานอย่างไร:

http://prasath.posterous.com/cassandra-55


น่าสนใจมากขอบคุณเพื่อนของฉัน พวกเขาเปลี่ยนไปใช้ Cassandra จาก sql เมื่อใด คุณรู้หรือไม่?
Marin

1
ระวัง: Posterous Spaces ตายแล้ว ... ดังนั้นลิงค์
TechNyquist

6

โพสต์ล่าสุดในเดือนมิถุนายน 2013 นี้มีรายละเอียดเกี่ยวกับการอธิบายการเปลี่ยนจากฐานข้อมูลความสัมพันธ์ไปเป็นวัตถุที่มีการเชื่อมโยงสำหรับข้อมูลบางประเภท

https://www.facebook.com/notes/facebook-engineering/tao-the-power-of-the-graph/10151525983993920

มีกระดาษที่ยาวกว่านี้ที่ https://www.usenix.org/conference/atc13/tao-facebook's-distributed-data-store-social-graph


5

คุณกำลังมองหาคีย์ต่างประเทศ โดยทั่วไปคุณไม่สามารถมีอาร์เรย์ในฐานข้อมูลได้เว้นแต่จะมีตารางเป็นของตัวเอง


สคีมาตัวอย่าง:

    ตารางผู้ใช้
        รหัสผู้ใช้ PK
        ข้อมูลอื่น ๆ
    โต๊ะเพื่อน
        userID - FK ไปยังตารางของผู้ใช้ที่แสดงถึงผู้ใช้ที่มีเพื่อน
        friendID - ตาราง FK ถึงผู้ใช้แทน ID ผู้ใช้ของเพื่อน

5
ทำไมต้องโหวตลง? อย่างน้อยก็บอกให้ใครรู้ว่าทำไมคุณถึงลดคะแนนพวกเขา
Sasha Chedygov

3
@freak: ทำไม? แนวคิดทั้งหมดของการลงคะแนนบนไซต์นี้มีไว้สำหรับการโหวตแบบไม่เปิดเผยตัวตน ทำไมคุณรู้สึกว่ามีสิทธิได้รับอะไร?
GEOCHET

4
โดยเฉพาะอย่างยิ่งเมื่อมันเป็นคำตอบที่ถูกต้องและถูกสะท้อนโดยคำตอบอื่น ๆ (แม้ว่าฉันจะไม่ได้คัดลอกจากพวกเขา แต่เมื่อฉันตอบก็ไม่มีคำตอบใด ๆ )
Malfist

4
@TheTXI: ฉันคิดว่าการแสดงความคิดเห็นเกี่ยวกับการโหวตลดลงเป็นความสุภาพโดยเฉพาะอย่างยิ่งกับคำตอบที่ไม่สมควรได้รับอย่างเห็นได้ชัด แต่ฉันก็เห็นด้วยว่าไม่ควรบังคับให้แสดงความคิดเห็น
Robert S.

2
คนที่ลงคะแนนโดยไม่เปิดเผยตัวในคำตอบที่ไม่ชัดเจนคือคนที่กลัวว่าเหตุผลตื้น ๆ ของพวกเขาจะถูกเปิดเผยหากพวกเขาแสดงความคิดเห็นอธิบายการลงคะแนน
Vinayak


1

โปรดทราบว่าตารางฐานข้อมูลได้รับการออกแบบให้เติบโตในแนวตั้ง (แถวมากขึ้น) ไม่ใช่แนวนอน (คอลัมน์เพิ่มเติม)


24
ไม่เคยลืม! พ่อของฉันเสียชีวิตเพราะตารางฐานข้อมูลที่เติบโตในแนวตั้งมากเกินไปสำหรับคอลัมน์ของมัน ฉันจะคิดถึงคุณพ่อ
belgariontheking

1
อืมทำไมโหวตลง? และความคิดเห็นด้านบนอันนี้ไม่สมเหตุสมผล
Neil N

2
ไม่ความคิดเห็นไม่สมเหตุสมผล ดูเหมือนว่ามีใครบางคนพยายามทำตัวตลกดังนั้นอย่ารังเกียจ
Dirk Vollmar

0

เกี่ยวกับประสิทธิภาพของตารางแบบกลุ่มต่อกลุ่มหากคุณมี ID ผู้ใช้ที่เชื่อมโยงระหว่าง 32 บิต 2 รายการพื้นที่จัดเก็บข้อมูลพื้นฐานของคุณสำหรับผู้ใช้ 200,000,000 คนโดยเฉลี่ย 200 คนต่อคนจะมีขนาดไม่เกิน 300GB

เห็นได้ชัดว่าคุณต้องมีการแบ่งพาร์ติชันและการทำดัชนีและคุณจะไม่เก็บสิ่งนั้นไว้ในหน่วยความจำสำหรับผู้ใช้ทั้งหมด


0

อาจมีตารางซึ่งเก็บเพื่อน <-> ความสัมพันธ์กับผู้ใช้พูดว่า "frnd_list" โดยมีฟิลด์ "user_id", "frnd_id"

เมื่อใดก็ตามที่ผู้ใช้เพิ่มผู้ใช้อื่นเป็นเพื่อนจะมีการสร้างแถวใหม่ขึ้นสองแถว

ตัวอย่างเช่นสมมติว่า id ของฉันคือ 'deep9c' และฉันเพิ่มผู้ใช้ที่มี id 'akash3b' เป็นเพื่อนจากนั้นแถวใหม่สองแถวจะถูกสร้างขึ้นในตาราง "frnd_list" ด้วยค่า ('deep9c', 'akash3b') และ ('akash3b ',' deep9c ')

ตอนนี้เมื่อแสดงรายชื่อเพื่อนให้กับผู้ใช้คนใดคนหนึ่ง sql ธรรมดาจะทำเช่นนั้น: "เลือก frnd_id จาก frnd_list โดยที่ user_id =" โดยที่ id ของผู้ใช้ที่ล็อกอิน (เก็บไว้เป็น session-attribute)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.