Veritabanı tasarımı, web sitesi için kullanıcılara iki tür

7 Cevap php

Ben bir inceleme türü web sitesi yapıyorum ve kullanıcılar 2 tip olması için ben isterim. Diğer incelemesi hakkında kişi olacağını iken bir çoğunluk, yorumcular olacaktır. Nasıl, veritabanı tasarımı açısından ben ikisini ayırt ediyorum. Ben yorumcular ve reviewies için ayrı tablolar ya da sadece ikisi için kimlikleri farklı bir dizi atamak gerekir?

7 Cevap

Bu klasik bir super-type/sub-type durumdur. Kullanıcılar ve yorumcular hem de insanlar ve ilişkisel yobazlar size ortak kişinin tüm alanları içeren bir "insan" tablo olmalıdır söyleyebilirim. Daha sonra diğer yorumcusu özgü tablolara yorumcusu özel alanları ve ilgili anahtarları içeren bir yorumcular tablo, açık bir-bir Yutulan yabancı anahtar ilişkisi olabilir. Bir kişi Gözden masaya katılarak bir yorumcusu olup olmadığını görmek için kontrol edin.

Siz tabii ki bu yaklaşım, farklı veri ile insanların diğer türleri ekleyebilirsiniz. Bu null değerli alanları ve çeşitli tablolar birine başvuruda bildirilmemiş yabancı anahtarları önlemek istiyorum benim gibi ilişkisel bağnazlarına şeyleri modellemek için iyi bir yoldur. MySQL jokeyler sadece varchar alanlarda deliklerle dolu, sihirli sayılar, ve virgülle ayrılmış listeleri ile bir büyük bir tablo içine tıkmak olur.

Eğer biliyorsanız gereksinimleri gelecek (ha!) değişiklik olmayacak ve kullanıcılar ve yorumlara arasında şemasında fark yoktur, sadece tek bir person_type alanını kullanın ve basit tutun.

Herhangi bir nedenle "anahtar aralıkları" asla kullanmayın. Bu sadece sizin için bir kitlesel acı recoding çaba ya da birkaç yıl içinde başkasına neden olur sadece hackery bulunuyor. İlköğretim tuşları semantik ve değişmez olmadan olmalıdır.

Ben durumda daha sonra tip hem de kullanıcıların ihtiyaç, kullanıcılar için bir yabancı anahtar ile, kullanıcılara ve UserType için diğer için bir tablo oluşturmak için tavsiye.

Sorunuzun belirsizlik göz önüne alındığında, ben bu parti ya / sokulmasına erişen olacağını bilgilerin türüne bağlıdır söyleyebilirim. Anladığım kadarıyla, sizin veritabanı yapısı mutlaka sizin veritabanı kullanıcıları arasındaki ilişkiyi veri değil organize edildiği şekilde yansıtmalıdır. Örneğin, 0 ile ayrı masaya çağırdı "Kullanıcı Durumu" olabilir -> Yorumcu, 1 - Verilen bir kullanıcı olup olmadığını gösteren bir sütun olarak kullanıcılar tablodaki yabancı anahtar olarak> İnceleme-ee, sonra liste Kullanım Durumu böylece ayrı bir Kullanıcı tablolar için ihtiyacı ortadan kaldırarak, bir Yorumcu veya incelenen.

Bir sütun değerleri ile 'tip' "yorumcusu" ve "incelenen" olabilir

İşte bu kullanıcı türleri hakkında tutuyor hangi verilerin üzerinde oldukça büyük ölçüde bağlıdır. Çok benzer ise, tek bir tablo tamam olabilir, ancak yerine kimlikleri bir dizi atama daha ayırt alan (sütun) isterdim.

Eğer yorumcular ve reviewees hakkında farklı bilgilere ihtiyaç ve aksi bir arada bu bilgileri tutmak mantıklı eğer, o zaman en azından iki tabloya onları ayırmak için iyi yaparım.

Bu iki farklı kullanıcılara anlatan nitelikleri farklı ise, o zaman onları ayırmak isteyebilirsiniz. Onlar velastName vb firstName gibi, aynı özelliklere paylaşıyorsanız, o zaman aynı tabloda tutabilirsiniz.

Bir zaman, burada SO birisi "HER ZAMAN aynı tabloda şeyler gibi koydu" dedi.

'Gibi' o SO'ers tanımı o zaman doğrudur, bir tanımı oluşturmak böylece belirsiz olduğu için bu doğrudur.

Yani dedi, burada aynı şeyi yapmalı. Hakemler ve incelenen hem 'insan' olduğu gerçeği alakasız. Asıl soru hiç kimse ikisi de olabilir mi? Bu doğru değil, o zaman hiçbir sorun olacak ve aslında ayrı tablolar kullanmanız gerekir.

Şöyle düşünün.

Kullanıcının bu doğru yorumcular reviewees olamaz var diyelim. Bir yere Reviewer_ID ve Reviewee_ID hem bir tablo olacak. Siz geri bu iki tablo için bir FK inşa edeceğiz. Bu Kısıtlamalar Eğer bir eleştirmen ve bir de incelenen olacak ki GARANTİ ... Birinden 2 zorunda kalmayacaksınız.

Onlar 'çapraz elbise' tabiri caizse edebilir ve iki tablo inşa Ancak, farklı id onlar aynı kişi olduğunu bilmek (daha fazla katmanları ekleyerek yanı sıra) bir yolu yok hem tablolarda aynı kişi koymak gerekecek ya ya da başka bir Super-type/sub-type tarzı değişiklik olurdu.

Aynı tabloda şeyler gibi koyun. Ve ne like gerçekten demektir davranışsaldır. Onlar profesör ve filmler bile gözden geçirilebilir şeyler bir tabloya gitmek gerekir. Onların farklı özelliklerini (null sütun veya supertype / alt tip olarak) nasıl ele) sağladığınız daha fazla bilgi ile belirlenir.