Bir "Dostluk" yapısı nasıl, PHP ve MySQL kullanarak

7 Cevap php

Facebook, myspace gibi topluluk web siteleri için. Onlar, "Dostluk" adı verilen bir özellik, vb, arkadaş eklemek "arkadaş isteği add" göndermek anlamına gelir var.

Veritabanında yapısı nasıl? Ben aracı, ne tablolar gereklidir? Gerekli her tablo için sütunları nedir?

7 Cevap

masa Kişi

2 FK adlı Kişiye tabelası Dostluk

Bu sadece ortak olan Database normalization

Kullanıcıların Kullanıcılar tablosunun kendilerine verilen benzersiz kimlikleri kullanarak arkadaş daha sonra bir "arkadaş" masa depolama kendi özgün kimliği ile kullanıcılara saklayan bir tablo gerekir.

This article Eğer tablo yapısı nasıl anlamanıza yardımcı olacaktır

Bu facebook hatta online önce, geçmişte bunu yapmış nasıl ....

Tables tbl_users, tbl_users_friendship

Tablo Tanımı

tbl_users

intID(Primary Key) and other fields.....

tbl_users_friendship

INtId değeri (tablo için birincil anahtar)

dostluk başlatılan intUserID (yabancı anahtar (tbl_users-> INtId değeri)) onlar kişi

intFriendID (Yabancı Anahtar (tbl_users-> INtId değeri)) dostluk inivited edildi kişi

intStatus (bu bayrak arkadaşı geminin durumunu doğrulamak için kullanılır), aktif, özürlü, asma .... vb

Bu veritabanı soru olmamalı, bu bir kullanıcı deneyimi soru olmalıdır.

Dostluklar ne tür sitenin amacını destekleyecek? Samimiyet madde düzeyi mi? Sadece arkadaş-to-arkadaş, ya da arkadaş-to-peergroup-arkadaş mı? Nasıl gizlilik oyuna geliyor?

Ölçeklenebilirlik sorunu bir noktasında geliyor. Örneğin, Facebook kendi sayfasını ziyaret ettiğinizde, size ve başka hemen hemen herkes arasında "ortak arkadaş" bulmak için bu yoğun Arkadaşı arkadaşıma karşılaştırmalar yapar. Tepki subsecond olmak zorundadır - ve her kullanıcı arkadaşlar yüzlerce veya binlerce olabilir. Bu büyük önbelleğe alma ve özel programlama alır.

Muhtemelen bir süre için böyle bir sorun olmaz. Eğer deneyim ihtiyaçlarının ne olduğunu anlamaya eğer sizin için, veritabanı tasarımı, sade olmalıdır.

O id ilişki INVITER veya davet kişiye karşılık eğer ilk etapta bilmiyorum, çünkü büyük bir sorun, bence, sonuçta sorguları optimize etmek, sadece kimliği ile, o zaman yapmak zorunda pek çok karşılaştırmalar ve sorgular, ve bu durumda endeksler ile nasıl başa hiçbir açıktır. A = id tüm arkadaşlar istemek zorunda ve sonra tüm B = id arkadaşlar, ve tüm alanları almak için kullanıcı tablo için sorgu. O zaman soru bir b dostluk talep olup olmadığını bilmek zorunda çünkü, bu kadar basit değildir, ve b, vb dostluk talep etmişse ..

Bunu yapmanın bir yolu, sahip olacaktır

Table user -- contains user details, primary key user_id
Table friends -- contains user_id, friend_user_id, along with friendship status/type

Yep, two tables, one with the users and one like this: friends(user_id, friend_id) both foreign key of friends is good. But indexing this table, or using a foreign key (like in my example) slows down the database on inserting new values. I mean, after 2 million friendships having each user an average of 50 friendships, the entire table is collapsing after only 40k users. That is really the problem. How to solve it?

Teşekkür ederim