2016-03-29 22 views
0

Son zamanlarda, "kullanıcı ilişkisi" hakkında bir veritabanı çözümü tasarlamaya çalışıyorum — her kullanıcının arkadaşları vardır, her arkadaşın bir yetkisi vardır (yetki, ilişkilerinin arasındaki gizlilik düzeyini tanımlar).İlişkisel veritabanı tasarımı (MySQL kullanarak)

tasarım 1: databse böyle user_id, yaş, e-posta ... gibi tüm kullanıcıların taban bilgilerini açıklamak dair bir "user_table" vardır ve her MySQL programında yepyeni am, burada benim iki veritabanı tasarımı kullanıcısı bir "friends_table" değerine sahiptir, "friends_table" arkadaşın user_id'ini içerir (arkadaşınızın bilgisinden sorgulanabilir), her "friend_table", "user_table" (her bir friend_table'ın adı benzersizdir) içinde depolanan tablo adıyla sorgulanabilir.

user_table 
+------------------------+ 
| user_name(primary key) | 
+------------------------+ 
|  password  | 
+------------------------+ 
|   email   | 
+------------------------+ 
|   ....   | 
+------------------------+ 
|   ....   |    friend_table 
+------------------------+ ----------> +------------------------------+ 
| friend_table_name |    |   id(primary key)  | 
+------------------------+    +------------------------------+ 
             |   user_name   | 
             +------------------------------+ 
             |   authority   | 
             +------------------------------+ 
             |    ....    | 
             +------------------------------+ 

tasarım 2: databse bir "user_table" ve "relationship_table" vardır. "relationship_table" tüm kullanıcının ilişkisini tanımlar.

user_table    
+-----------+-----------+---------------+ 
| user_name | password |  email | 
+-----------+-----------+---------------+ 
| Jim | ***** | [email protected] | 
+-----------+-----------+---------------+ 
| LiLei | ***** | [email protected] | 
+-----------+-----------+---------------+ 
| .... | ***** |  ....  | 
+-----------+-----------+---------------+ 
| .... | ***** |  ....  | 
+-----------+-----------+---------------+ 

relationship_table    
+-----------+-----------+---------------+---------------+ 
|  id | user_name | friend_name | authority | 
+-----------+-----------+---------------+---------------+ 
|  1  | Jim |  Lisa  |  ***  | 
+-----------+-----------+---------------+---------------+ 
|  2  | Jim |  Tom  |  ***  | 
+-----------+-----------+---------------+---------------+ 
|  3  | Jim |  Jerry  |  ***  | 
+-----------+-----------+---------------+---------------+ 
|  4  | Jim |  Johnny |  ***  | 
+-----------+-----------+---------------+---------------+ 
|  5  | Qing |  Jim  |  ***  | 
+-----------+-----------+---------------+---------------+ 
|  6  | Feng |  Tom  |  ***  | 
+-----------+-----------+---------------+---------------+ 
|  7  | Guang |  Tom  |  ***  | 
+-----------+-----------+---------------+---------------+ 

Jim'in arkadaşı sorgulamak istiyorsanız, ben kullanın: tasarım 2

user_table       relationship_table 
+------------------------+   +------------------------+ 
| user_name(primary key) |   |  id(primary key) | 
+------------------------+   +------------------------+ 
|  password  |   |  user_name  | 
+------------------------+   +------------------------+ 
|   email   |   |  friend_name  | 
+------------------------+   +------------------------+ 
|   ....   |   |  authority  | 
+------------------------+   +------------------------+ 
|   ....   |   |   ....   | 
+------------------------+   +------------------------+ 

baz Jim adlı bir kullanıcı 4 arkadaşı Lisa, Tom, Jerry ve Johnny tbales aşağıda göstermek vardır SQL komutu: 10 Veritabanı performansı, bu 2 tasarım hangisi daha iyi olur? veya daha iyi bir tasarım var mı?

+0

"İç içe geçmiş model" için arama yap –

+1

design 1 bile bir seçenek değildir – Strawberry

cevap

0

Temelde arkadaşlar bile (varsayılan) kullanıcılardır, bu nedenle tüm insanları tek bir tabloya ekle. > Sadece basit bir otomatik artış sayıdır

AuthorityTable -

Yani temel tablolar

UserTable (kimliği, user_name [birincil anahtar], şifre, e-posta, ....) KullanıcıKimliği olurdu (AuthorityID, Authority_name, İzin, ....) AuthorityID -> sadece basit bir oto birimi sayısı,

UserRelationShipTable (URID, kullanıcı kimliği, FriendsWith, AuthorityID)

URID -> sadece basit bir otomatik artış numarası UserID -> burada yabancı bir anahtardır UserTable FriendsWith -> aynı zamanda AuthorityTable'dan Friends AuthorityID -> yabancı anahtarına benzeyen userID'dir.