Za wszystko, co zawsze ustawiony na co użytkownik powinien zachować to w Users
tabela, zgodnie ze zwykłą normalizacją. Jeśli chodzi o opcjonalną konfigurację, podoba mi się następująca struktura tabeli:
TABLE Users:
id INT AI
name VARCHAR
...
TABLE User_Settings
user_id INT PK,FK
name VARCHAR PK
type BOOL
value_int INT NULL
value_str VARCHAR NULL
Gdzie User_Settings.type
określa, czy należy odwoływać się do pola liczby całkowitej czy ciągu znaków.
tj.:
INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');
A w przypadku wydania WSTAW/AKTUALIZUJ:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
Ponadto, jak mówi większość innych osób, serializowanie i przechowywanie preferencji nie jest szczególnie dobrym pomysłem, ponieważ:
- Nie możesz pobrać pojedynczej wartości za pomocą zapytania, musisz pobrać cały serializowany ciąg, odserializować go i odrzucić niepotrzebne dane.
- Łatwo ulega uszkodzeniu i trudno go odzyskać.
- Bardzo trudno jest napisać surowe zapytanie, np. globalnie naprawić pewne ustawienie.
- Przechowujesz zasadniczo dane tabelaryczne w jednym polu tabeli.
Edycja retrospektywna z września 2016 r.:
W międzyczasie miałem kilka kłótni z ludźmi o to, jak najlepiej przechowywać opcjonalne ustawienia, a także o ogólną strukturę tabeli zdefiniowaną powyżej.
Chociaż ta struktura tabeli nie jest całkowicie zła , to nie jest dokładnie dobre zarówno. Próbuje jak najlepiej wykorzystać złą sytuację. Serializacja opcjonalnych ustawień może działać, o ile możesz dostosować się do tych ustawień:
- Wszystko jest ładowane na raz, bez wybierania ani wybierania.
- Nie można indeksować, przeszukiwać ani łatwo modyfikować masowo .
Następnie możesz rozważyć dodanie pola, takiego jak optional_settings
w Users
tabela zawierająca zserializowaną postać [np.:JSON] ustawień. Omijasz powyższe, ale jest to prostsze podejście i możesz przechowywać bardziej złożone ustawienia.
Ponadto, jeśli używasz typu LOB, takiego jak TEXT
do przechowywania dane niekoniecznie są przechowywane "w rzędzie", przynajmniej w MySQL.
W każdym razie to zależy od Ty aby określić wymagania i ograniczenia aplikacji i dokonać najlepszego wyboru na podstawie tych informacji.