2011-07-11 26 views
13

Twitter benzeri gibi bir "takip/takip etmeyi bırakma" özelliği için en iyi tablo tasarımını belirlemeye çalışıyorum (düzenleme: Twitter benzeri bir uygulama yapmıyorum.) Aşağıda benim mevcut tablo tasarımı ve php işleme. En iyi yaklaşım olup olmadığından emin değilim ve geri bildiriminizi gerçekten takdir edersiniz. Takip günü"Kullanıcıyı takip et" veritabanı tablosu tasarımı

CREATE TABLE IF NOT EXISTS `user_follow` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `follower` int(11) NOT NULL, 
    `following` int(11) NOT NULL, 
    `subscribed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `follow_unique` (`follower`,`following`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; 

, takipçileri kimliği follower alan ve following eklenir takip edilecektir kullanıcının kimliği eklenir. Ayrıca, bir kullanıcının subscribed alanındaki başka bir kullanıcıyı takip etmeye abone olduğu tarihi de kaydediyorum. Abonelik tarihi sıralama için kullanılabilir.

Bir kullanıcı takibi bıraktığında, sadece ilgili satırı siliyorum.

Yinelenen satırları önlemek için, follower ve following sütunları benzersiz yaptık. Bir kullanıcı bir kimliği aşağıdaki zaten tekrar takip etmek tıklarsa, ben Örneğin

zaten Mükerrer giriş '62 -88' follow_unique 'Açıkçası

tuşuna için' Aşağıdaki zaman veritabanı hatası 1062 olsun Bir kullanıcı, takipçisi unfollow düğmesini görür. Bu, bir takipçisi takip eden tablo satırının 2 kullanıcı arasında olup olmadığını kontrol ederek elde edilir. rows > 0 I ise unfollow görüntülüyorsa follow.

Peki, sizce ne düşünüyorsunuz?

+3

Twitter'ı yeniden oluşturmaya çalışmıyorum .. Tamamen farklı bir amaç için ama abonelikler açısından Twitter ile aynı işlevselliğe sahip – CyberJunkie

+2

İyi geliyor, ama ekleyeceğim (henüz yapmadıysanız) Yabancı Anahtar kısıtlamaları Kullanıcılar tablosuna 'follower 've' aşağıdakileri' ekleyin. – Dirk

+2

Yaptığın şey bana iyi görünüyor. 'MyISAM' yerine 'ENGINE = InnoDB' kullanmanızı öneririm, böylece 'FOREIGN KEY' ilişkilerini ve 'ON DELETE/UPDATE' komutlarını uygulayabilirsiniz. Bu, etkili olması için pek çok tablonuzda motor değişiklikleri gerektirebilir. –

cevap

7

Bence bu çok iyi bir tasarım ve ihtiyaçlarınızı güzelce karşılamalı. Bir şey; Muhtemelen follower ve following yabancı anahtarları yapmalısınız. Ah, ve basitlik uğruna, sadece abone olan kullanıcı zamanını yakalamak için subscribed sütununu TIMESTAMP DEFAULT CURRENT_TIMESTAMP yapabilirim.

+0

Teşekkürler! Yabancı Anahtar kısıtlamalarına göre, takipçi için benzersiz bir kimlik ve doğru olanı mı söylüyorsunuz? Eğer öyleyse öyle. Yabancı anahtar kısıtlamalarla – CyberJunkie

+4

@CyberJunkie, onlar sizin yabancı anahtarlar için izin veren alternatif mysql tablo motoru, innodb, tabloları değiştirmek demek. Bu kısıtlamalar, örneğin bir kullanıcı kaydını silmeniz ve yabancı anahtarla bağlantılı diğer tablolarda kayıtlar olsaydı, bu kayıtların silinmesini ve böylece artık kayıtların önlenmesini sağlar. ayrıca güncellemeler için çalışıyor. phpMyAdmin'de kurulabilir. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html – dqhendricks

+0

Açıklama için teşekkürler! Bu özelliğin farkında değildim, kesinlikle ona daha çok bakacağım! – CyberJunkie

3

Ön izlemeyi ve birincil anahtarı birlikte izlemenizi öneririm. Ayrı bir id alanına gerek yoktur.

+0

Bunu daha önce tavsiye etmiştim ama bir nedenden dolayı bana “hacky” gibi geliyor, ayrıca her ikisini de yapamam. Bir hata alıyorum ya da hiçbir şey olmuyor. Ayrıca A.I.benzersiz birincil anahtar. Veri tabanı standardı. Kulağa hoş gelmek istemiyorum, sadece bu yaklaşım hakkında çok şey bilmiyorum – CyberJunkie

İlgili konular