2012-10-22 33 views
5

Bir arkadaş sistemi oluşturmak istiyorum (facebook'ta olduğu gibi).mysql tabloları optimize et

Ben MySql ilişki verileri kaydetmek istiyorum ama daha iyi olduğunu yolu bilmiyorum: (

id | people1 | people2 
1 | john | maria 
2 | john | fred 
3 | maria | fred 

:

  1. gibi tek bir giriş olarak everysingle ilişki kaydetmek için Orada tüm bu 3 halk arasındaki ilişkileri beyan ederim)

  2. Herkes adını kaydetmek ve arkadaşlarını listelemek için:

    id | people | friends 
    1 | fred | mary, john 
    2 | mary | john, fred 
    3 | john | fred, mary 
    

Veya daha iyi bir yolu var mı?

+0

Bir seçenek, db'niz büyüdükçe, seçenek 2'de yaptığım zaman gördüğüm herhangi bir problemi görmezden gelmem, seçenek 2'ye ekleme ve düzenleme işleminin bunu daha da zorlaştıracağını söyleyebilirim. Buna şahin olan zulüm. – Dorvalla

+0

# 2 haklı olarak kötü uygulama olarak kabul edilir, bkz. Http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad –

+0

kesinlikle - ilk yol. her ne kadar olsa da, isim değil, insanlar için sayısal kimlik numaraları kullanın. – Randy

cevap

11

Hayır Sevgili,

sadece yapmak arkadaşı ilişki için tek tablo gerekir. yapı,

kimliğini kullanıyorum izliyor (birincil anahtar) | my_id (tamsayı günlüğü kullanıcı kimliği) | Bizim kullanıcıların tabloda iki kullanıcımız var gibi

sonra birbirimize

id | name | age 
1 | vipan | 12 
2 | karan | 12 
ile ilişkisi yapmak hem kullanıcı için iki giriş friend_id (o günlüğe kullanıcıdan arkadaşlık isteğini alacak başka bir kullanıcının tamsayı kullanıcı kimliği)

sonra giriş olmalıdır

id | my_id | friend_id 
1  1  2 
2  2  1 

iyi tablo yapısı i kullanmak öyle düşünüyorum edilir her durumda aşağı oy ama sitemde bu tablo yapısını kullanmak zorunda ve bu joomsocial kullanılan aynı yapıdır etmeyin ve lütfen virgülle ayrılmış valu kullanmayın katılır ve bazı durumlarda ilişki

Separate comma separated values from mysql table

+1

Lütfen bu yazıya bakın 4 sayı yorumu http://stackoverflow.com/questions/9906430/separate-comma-separated-values-from-mysql-table –

+0

Ancak, bir kişinin tüm arkadaşlarını yazdırmam gerekecek isimlere ihtiyacım var ve başka bir masadan her bir kişinin adını almak için çok hızlı görünmüyor (arkadaş sayısı 500'ün üzerinde ise ve 100k'ın üzerindeki kullanıcı tablosunda girişler varsa) –

4

İlki en iyisi hiç şüphesiz ikinci bir sebep yazının bu aşağıdaki bağlantıda 4 numara yorumunu bakınız tabloda es onlar sorunu yapacak first normal form'a uymaz. o veritabanı normalleştirme hakkında

Here 's bağlantısını düzenlemek için gerçekten acı alacak nedeni

Aynı sütunda birden fazla değer kaçınmak gerekir. Çoğu zaman, normal normal forma saygı duyuyoruz çünkü normalleşme ve performans arasında iyi bir uzlaşma. Ayrıca, Randy'nin dediği gibi, ID'leri kullanmanız gerekir, böylece onları yabancı bir anahtarla bağlayabilirsiniz.

+0

ama bazılarının tüm arkadaşlarını yazdırmam gerekecek kişi, bu yüzden isimleri gerekecektir ve başka bir tablodan her kişinin adını almak için çok hızlı görünmüyor (arkadaşlar sayısı 500'ün üzerinde olacak ve 100k üzerinde kullanıcı tablosunda girişler varsa) –

+0

Peki, bir katılım maliyet değildir o kadar çok ve bana güveniyorum mysql 100k satırları halledebilirim bu yüzden bu durumda performans için normalizasyonu feda etmeyeceğim. İlk normal form – Marc

+0

@MindaugasJakubauskas'a da uymazdı. Ayrıca, örneğin: John'un Robert'in bir arkadaşı olup olmadığını bilmelisiniz ... Bütün ipleri ve ayrıştırmaları başlatacak mısın? Bu performans için gerçekten iyi değil ve acı verici. Bunun yerine, seçenek 1 ile, sadece normal bir seçim yaparsınız ve dizinlerinizi iyi bir şekilde ayarlarsanız, bir saniye bile sürmez. – Marc

İlgili konular