2009-02-28 37 views
5

Kullanıcı tercihleri ​​için bir tablo oluşturmak istiyorum ve bunu yapmanın en iyi yolunu bulamıyorum. ASP.NET'in varsayılan olarak yaptığı gibi son derece garip görünüyor ve bundan kaçınmak isterim. Şu anda, her kullanıcı tercihi için farklı bir sütuna sahip olduğum her kullanıcı için bir satır kullanıyorum (normalleştirilmemiş, biliyorum)."Kullanıcı Tercihleri" Veritabanı Tablosu Tasarımı

Yani, birlikte gelmişti diğer fikri kendi tabloya Tercihler kendilerini bölmek ve sonra bir kullanıcı tercihleri ​​tablosunda kullanıcının BAŞINA tercihine BAŞINA bir satır var idi; bununla birlikte, bu her tercihin benim için de çekici olmayan aynı veri türü olması gerektiği anlamına gelir.

Yani, sorum şu: Kullanıcı tercih değerlerini tutmak için bir veritabanını tasarlamanın en iyi/en mantıklı yolu nedir?

cevap

3

Veritabanı çalışmasında kaçınmaya çalıştığım bazı fikirler veri çoğaltma ve gereksiz bir komplikasyon. Ayrıca "insert, update, and deletion anomalies" dan kaçınmak istiyorsunuz. Kullanıcı tercihlerini her satırdaki bir satırda = bir kullanıcı ve sütunlar ile saklamak, mevcut olan farklı tercihleri, mantıklı kıldı.

Şimdi, bu tercihleri ​​veritabanınızda başka bir biçimde veya şekilde kullanıldığını görebiliyorsanız, aynı tercihleri ​​kullanan birden çok nesne (yalnızca kullanıcı değil) gibi, ikinci rotanızı aşağıya çekmek ve FK/PK çiftleri ile tercihler.

Açıkladığınız şeye göre, ilk rotanın neden çalışmadığına dair bir neden göremiyorum.

2

Bunu genelde:

Users table (user_id, .... etc.) 
. 
Options table (option_id, data_type, ... etc.) 
(list of things that can be set by user) 
. 
Preferences table (user_id, option_id, setting) 

farklı veri türlerini olmak ve opsiyon tanımının bir parçası olarak seçeneğin veri türünü kaydedebilirsiniz yüzden ayar alanın Yeni SqlVariant veri türünü kullanın Sorgulandığında doğru türe geri döndürmek için seçenekler tablosu.

+0

Bu durumda, data_type ne olurdu? Tüm veri türlerini içeren başka bir tablo var mı? Bu bir FK mi? – NSX

+0

data_type, "ondalık (4,2)" gibi bir dize veya uygulamanızdaki bir Numaralandırma ile tanımladığınız bir sayı olabilir. Böylece, uygulamanız sonucu ortak bir veri türüne nasıl yazdıracağınızı belirleyebilirsiniz. –

+0

Eh, bir dize olması gerekmez. Bir dizi geçerli veri tipi tanımlayabilir ve bir Tip tablosu oluşturabilirsiniz. Bu benim çözümüme benzer olurdu. – BobbyShaftoe

0

Gerçek hızlı ve tek yöntemi:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...) 

Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...) 

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
+0

@ GregD, teşekkürler. :) – BobbyShaftoe

2

Eğer bir bakım kabus olacaktır Bir Kullanıcı tablonun tek bir satırda tüm kullanıcı tercihlerini saklıyorsanız!

kullanın kullanıcı başına tercihine başına bir satır ve bir varchar (255 say uzunluğu veya gereksinimlerini karşılamak için yeterince büyük bazı değer) olarak tercih değeri depolar. Bu sütunun değerlerini açık/kapalı hale getirmek zorunda kalacaksınız.

bu Bir Kullanıcı tercihi gibi bazı büyük ikili veri depolamak istiyor, ama bu ortak bir gereklilik olduğu tespit değil eğer kolayca olduğunu çalışmaz sadece bir durum.

+0

Ancak, her kullanıcı için tercih başına bir satır ile yapmak, her zaman okumuştum bir EAV tipi model ile sonuçlanacak gibi geliyor, her ne pahasına olursa olsun kaçınılmalıdır. – NSX

İlgili konular