2012-03-23 26 views
5

Web sitem için bir sosyal grafik hazırlıyorum. Kullanıcılar, her bir tarafın diğerini bağımsız olarak takip edebileceği ilişkiler (takip eden/takip edilen form) oluşturacaktır. Benim kullanıcıların tablo şöyle görünür: Bu model nasıl SQL Modelleme Takipçi/Takip Eden İlişkiler Sosyal Ağ için

Users table 
- UserId (PK, Auto-incrementing integer) 

Düşünme

, ben gibi birçok alternatifleri, ile geldim:

(a) Bir tablo bir şekilde her 'takip' eylemi tutar ayrı satır.

Bu, birçok kullanıcıya verilen çok sayıda satır yaratacağı dezavantajına sahiptir.

(b) Bir tablo, her kullanıcı, bir CSV veya diğer yapı olarak takip ediyor kullanıcıların listesini tutar: (? Ve masraflı)

Relationships table 
- FollowerId (FK to Users.UserId) 
- FollowingUsers (e.g. 2,488,28,40) 

Bu sorgular çok daha karmaşık olacağını dezavantajı var. Ben de ... vb dize değerlerini sırasını korumak zorundayız

kullanıcı ilişkisinin ya 'tarafında' olabilir (c) satır başına bir ilişki:

Relationships table 
- Party1Id (FK to Users.UserId) 
- FollowingParty2 (boolean) 
- Party2Id (FK to Users.UserId) 
- FollowingParty1 (boolean) 

Bu, satırları (a) üzerinden kaydeder, ancak sorgular daha karmaşıktır, çünkü kullanıcı taraf olabilir.

hem benzeri listeleri gibi ardından ' 'Aşağıdaki' ve Yerleştirme (d), (b)

Relationships table 
- UserId (FK to Users.UserId) 
- FollowingUsers (e.g. 2,488,28,40) 
- FollowedBy (e.g. 2,488,28,40) 

Bu, tüm dünyanın en iyisi gibi görünüyor, ama şimdi Birden fazla satır güncellemek için işlemler kullanmak zorunda .

"Facebook'un sorunlarım benim sorunum değil" in farkında olsa da, büyük bir boyuta ölçeklemek istediğimi varsayarsak - hangi seçenek ya da başka bir seçenek tercih edilir?

cevap

5

Ben sosyal grafik analizi her türlü

  • hiçbir Orada diğer seçenekleri kullanarak imkansız olacaktır ilişkisel kısıtlamaları her türlü Zorlamayı diğer seçenekleri
  • kullanarak imkansız olacaktır

    1. seçenek A. ile gider Veriyi ilişkisel bir şekilde depolamayı planlamıyorsanız ilişkisel veritabanını kullanmanız gerekir.

    ilginç bir seçenek ilişkileri tablo modeli dikkate almak olabilir:

    İlişkiler tablo (Users.UserId için FK)

    • relationshipId
    • KullanıcıNo
    • RelationType

    Artık kullanıcıları bağlayabilirsiniz.

    durumda B A aşağıdaki gibidir:

    : RelationshipId1, UserAId ekleyin
  • A, aşağıdaki
  • vaka Başka bir kullanıcı başlıyor "IsFollowing" RelationshipId1, UserBId, add "IsFollowed"

      • RelationshipId1, AnotherUserId, "IsFollowing"
      • İsterseniz

      Hatta gereksiz satırları ortadan kaldırabilir "IsFollowing",

      • RelationshipId2, AnotherUserId ekleyin: 210

      vaka Başka bir kullanıcı B aşağıdaki başlar A'dan B'ye aşağıdaki başlar:

      • RelationshipId3, UserAId, "İzlemeyi Takip Ettirenler"
      "IsFollowing"
    • RelationshipId1, UserBId kaldır "IsFollowedAndIsFollowing" RelationshipId3, UserBId, eklemek,