Kendimi hatırlıyorum beri LAMP (Linux + Apache + MySQL + PHP) gelişmekte ediyorum. Ama bir soru şimdi yıldır beni rahatsız oldu. Ben bir cevap bulmak ve doğru yönde bana gelin bana yardımcı olabilir umuyoruz. İşte benim bir sorundur:
Say, bizim kullanıcıların kayıt için izin bir topluluk web sitesi yaratıyor. Tüm kullanıcıları saklamak MySQL tablo bu böyle sonra görünecektir:
CREATE TABLE `users` (
`uid` int(2) unsigned NOT NULL auto_increment COMMENT 'User ID',
`name` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL COMMENT 'Password is saved as a 32-bytes hash, never in plain text',
`email` varchar(64) NOT NULL,
`created` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of registration',
`updated` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of profile update, e.g. change of email',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Yani, bu pasajı sizi her yeni kullanıcı 'uid' alanı için artan otomatik olarak benzersiz ve sahip olduğunu görebilirsiniz. Her iyi ve sadık bir topluluk web sitesinde biz onlar bizim toplumda onların katılımını iptal etmek istiyorsanız, tamamen kendi profilini silmek olanağı sunmak gerekir.
İşte benim sorun gelir. Alice (uid = 1), Bob (uid = 2) ve Chris (uid = 3): Hadi biz 3 kayıtlı kullanıcımız var diyelim. Şimdi Bob onun profilini silmek ve topluluğumuza kullanarak durdurmak istiyor. Biz 'kullanıcılar' tablosundan Bob'un profili silin sonra onun eksik 'uid' tekrar doldurulabilir asla olacak bir boşluk yaratacaktır. Bence o uid yıllardan büyük bir israf var. Burada 3 olası çözümleri bakın:
1) SMALLINT (int (2)), örneğin, BIGINT (int (8)) bizim tabloda 'uid' alanının kapasitesini artırın ve uid yıllardan bazı boşa olacağı gerçeğini görmezden.
2) silinen profilleri işaretlemek (ama yeni kayıtlı kullanıcılar için yeniden kullanmak kendi uid adlı) bunları silmek yerine, masaya onları tutmak için kullanılacak 'is_deleted' yeni alanı, tanıtmak. Tablo bu gibi sonra görünecektir:
CREATE TABLE `users` (
`uid` int(2) unsigned NOT NULL auto_increment COMMENT 'User ID',
`name` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL COMMENT 'Password is saved as a 32-bytes hash, never in plain text',
`email` varchar(64) NOT NULL,
`is_deleted` int(1) unsigned NOT NULL default '0' COMMENT 'If equal to "1" then the profile has been deleted and will be re-used for new registrations',
`created` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of registration',
`updated` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of profile update, e.g. change of email',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3) Bir önceki rekor silindikten sonra aşağıdaki tüm kullanıcı kayıtları kaydırmak için bir komut dosyası yazın. Örneğin bizim durumumuzda zaman Bob (uid = 2) Chris o uid 2 ve işareti (is_deleted = '1 ') için qual olur böylece, biz Chris (uid = 3) ve kayıt ile yaptığı rekor yerini alacak, onun profilini kaldırmak için karar yeni kullanıcılar için boş olarak Chris eski rekor. Eski kullanıcılara düşük uid bulunuyor olması, böylece bu durumda biz, uid adlı kayıt zamana göre kronolojik sırasını tutmak.
, Auto_increment alanlardaki boşlukları işlemek için doğru yolu olan yolu artık beni tavsiye edin. Bu kullanıcı ile sadece bir örnektir, ama bu gibi durumlarda benim programlama deneyimi çok sık görülür.
Şimdiden teşekkürler!