2009-02-28 17 views
5

Szukam utworzyć tabelę preferencji użytkownika i nie mogę wymyślić najlepszy sposób to zrobić. Sposób, w jaki program ASP.NET robi to domyślnie, wydaje się wyjątkowo niezręczny i chciałby tego uniknąć. Obecnie używam jednego wiersza na użytkownika, gdzie mam inną kolumnę dla każdego preferencji użytkownika (nie znormalizowany, wiem)."Tabela preferencji użytkownika" Projekt tabeli bazy danych

Inną ideą, którą wymyśliłem, było podzielenie preferencji na własne, a następnie ustawienie w wierszu PER preferencji na użytkownika w tabeli preferencji użytkownika; jednakże oznaczałoby to, że każda preferencja musiałaby być dokładnie tym samym typem danych, co również nie brzmi zbyt zachęcająco.

Moje pytanie brzmi: Jaki jest najlepszy/najbardziej logiczny sposób zaprojektowania bazy danych do przechowywania wartości preferencji użytkownika?

Odpowiedz

3

Niektóre z pomysłów, których staram się unikać w pracy z bazami danych, to powielanie danych i niepotrzebne komplikacje. Ty też chcesz uniknąć "insert, update, and deletion anomalies". Mimo to, przechowywanie preferencji użytkownika w jednej tabeli z każdym wierszem = jeden użytkownik i kolumny, różne preferencje, które są dostępne, ma sens.

Teraz, jeśli możesz zobaczyć te preferencje używane w dowolnej innej formie lub sposobie w bazie danych, takie jak wiele obiektów (nie tylko użytkownicy), używając tych samych preferencji, wtedy zechcesz przejść do drugiej trasy i odnieść się do preferencje z parami FK/PK.

Co do tego, co opisałeś, nie widzę powodu, dla którego pierwsza trasa nie zadziała.

2

I zazwyczaj to zrobić:

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) 

używam nowy typ danych SQLVARIANT w polu ustawiania więc może to być różne typy danych i rejestrowania danych typu opcji w ramach definicji opcja w Tabela opcji umożliwiająca przeniesienie go z powrotem do odpowiedniego typu po zapytaniu.

+0

Więc, w takim przypadku, jaka byłaby data_type? Czy masz kolejną tabelę zawierającą wszystkie typy danych, więc jest to FK? – NSX

+0

data_type może być ciągiem takim jak "dziesiętny (4,2)" lub po prostu liczbą zdefiniowaną za pomocą wyliczenia w aplikacji ... tak, aby aplikacja mogła określić sposób rzutowania wyniku do wspólnego typu danych. –

+0

Cóż, to nie musi być ciąg. Można zdefiniować zestaw poprawnych typów danych i utworzyć tabelę typów. To byłoby podobne do mojego rozwiązania. – BobbyShaftoe

0

bardzo szybko, jedna metoda:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

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

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

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
+0

@GregD, dziękuję. :) – BobbyShaftoe

2

Jeśli przechowywać wszystkie swoje preferencje użytkowników w jednym wierszu tabeli użytkownika trzeba będzie koszmar konserwacyjnych!

Użyj jednego wiersza na preferencję dla każdego użytkownika i zapisz wartość preferencji jako varchar (długość 255 powiedz lub wartość wystarczająco duża, aby spełnić Twoje wymagania). Konieczne będzie oczywiście przekonwertowanie wartości do/z tej kolumny.

Jedyną sytuacją, w której to nie zadziała, jest z łatwością, jeśli chcesz przechowywać duże dane binarne jako preferencje użytkownika, ale nie uznałem tego za częsty wymóg.

+0

Jednak brzmi to tak, jakby robiąc to z jednym rzędem na preferencję na użytkownika spowoduje model typu EAV, który zawsze czytałem należy unikać za wszelką cenę. – NSX

Powiązane problemy