Jestem w trakcie prac nad systemem profilu użytkownika dla strony internetowej i zastanawiam się, jakie byłoby lepsze (skalowalne) podejście do podjęcia. Wymyśliłem dwa rozwiązania i szukam albo danych wejściowych, albo wskazówek do czegoś, co mogłem przegapić.Wybór metody przechowywania profili użytkowników?
Poniższe instrukcje tabel nie mają być wykonywane, ale służą jedynie do przedstawienia układu tabel.
Moją pierwszą myślą było coś takiego:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320),
user_joined DATATIME,
user_last_seen DATATIME,
user_name_first VARCHAR,
user_name_last VARCHAR,
user_name_alias VARCHAR,
user_location_country VARCHAR,
user_location_region VARCHAR,
user_location_city VARCHAR
# ...
);
Oczywiście nie jest to w ogóle bardzo skalowalne i dodanie dodatkowych właściwości i denerwujące. Jedyną zaletą jest to, że mogę szybko wyszukać użytkowników pasujących do określonego zestawu właściwości. Zrobiłem trochę rozglądania się i to dość powszechne podejście (np. Wordpress).
Moje drugie podejście (jeden Jestem obecnie zabawy z) jest znacznie bardziej skalowalne, ale jestem trochę zaniepokojony wydajność:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320)
);
CREATE TABLE user_profile(
user_id INT UNSIGNED NOT NULL,
visibility ENUM('PRIVATE', 'PUBLIC'),
name VARCHAR,
value VARCHAR
);
Stosując to podejście ma zastosowanie każdego zestawu wartości klucza powiązane z nim pary, co sprawia, że dodawanie dodatkowych właściwości jest banalne, a także ładowanie profilu użytkowników podczas logowania. Jednak tracę wszystkie informacje o typie, które miałem w pierwszym podejściu (np. DATETIME jest teraz zapisany jako sformatowany ciąg), więc niektóre wyszukiwania stają się denerwujące. To daje mi większą kontrolę nad wyborem właściwości, które użytkownik chce publicznie wyświetlić.
Czy podejście hybrydyczne byłoby lepsze, pozwalając zrównoważyć zalety i wady obu metod? Jaką metodę stosuje SO? Czy istnieje inne podejście do tego, o czym nie pomyślałem ani co przegapiłem?
Rozszerzenie: Z hybrydowego podejścia byłoby korzystne także wstawić właściwości z tabeli użytkownika do tabeli user_profile kontrolować ich widoczność dla innych użytkowników czy to może ewentualnie być postrzegane jako dodatkowe obciążenie?
Wydaje mi się, że (i popraw mnie, jeśli się mylę), że to podejście będzie z czasem podlegało "rozrostowi stołu" z wieloma tabelami dodawanymi do bazy danych w celu dodania innej funkcjonalności? –
Nie jestem pewien, czy nadmiar tabeli jest naprawdę problemem. Jeśli masz aplikację zawierającą 1000 punktów charakterystycznych, ale tylko 5 tabel, będę bardzo sceptycznie nastawiony do normalizacji tabel. Martin Fowler omawia tutaj schemat projektowania modułu tabeli: http://martinfowler.com/eaaCatalog/tableModule.html – DavGarcia