Autor Zpráva
MaK
Profil
Mám tabulku uživatelů obsahující snadno představitelné sloupce: user_id, name, email, created_time, password, state, face_img, ...

Uživatel se může nacházet v několika stavech (sloupec state):

opened_nc - účet otevřen, ale není zkonfirmovaný email
open - účet otevřen - 95% uživatelů je v tomto stavu
deactivated - účet deaktivován
deleted - účet smazán (čeká na kompletní odstranění všeho, co uživatel spáchal za celý svůj život)

Každý stav vyžaduje nějaký jiný přístup/činnosti/operace.
Např. ve stavu opened_nc chci uživatele opakovaně informovat, že účet nezkonfirmoval. To si žádá uložení dalších informací (kdy jsem ho naposled informoval, kolikrát jsem ho již informoval, ...).

A tím se dostávám k otázce. Jak to udělat?

Verze 1: Přidat do tabulky uživatelů sloupce smysluplné jen s tím jedním stavem. Případně přidat index potřebný pro práci jen s tím jedním stavem.

Verze 2: Vytvořit pomocnou tabulku users_opened_nc, zachycující všechny uživatele v tomto stavu.

Verze 3: Vytvořit pomocnou tabulku users_no_opened, která pokryje všechny stavy mimo stav opened.

Verze 4: ???

Jistě budou "fungovat" všechny verze, ale která verze je ta korektní z hlediska DB.
Firibix
Profil
Reakce na MaK:
Já bych za korektní považoval variantu s tabulkami:

users(id, name, email, created_time, password, state)
acc_confirmations(id, user_id, last_notice, notice_count)

kde v users budou uloženi všichni uživatelé a jejich stav bude zachycený ve sloupci state. Potřebná data ke sledování konfirmace účtu se uloží do tabulky acc_confirmations, kde user_id bude cizí klíč tvořící vazbu na tabulku users.
Kajman
Profil
Kolik tam bude řádků?

Přijde mi divné dávat last_notice, notice_count do nové tabulky. Vždyť všem uživatelům se přeci bude posílat žádost o potvrzení. Aby byli open, deactivated nebo deleted musí projít stavem opened_nc.
MaK
Profil
Kajman:
Kolik tam bude řádků?
Teď je všech řádků 3mil, ale těch ve stavu opened_nc jen 2tis.

Přijde mi divné dávat last_notice, notice_count do nové tabulky. Vždyť všem uživatelům se přeci bude posílat žádost o potvrzení. Aby byli open, deactivated nebo deleted musí projít stavem opened_nc.
Mně zase přijde divné "špinit tabulku" sloupci a indexy, které aktuálně využije 0,06% řádků. Ale možná se na to dívám jen špatně.
anonym_
Profil *
MaK:
Přesouvání uživatelů mezi tabulkami tak, jak jsi to navrhoval ty, je nesmysl (users_opened_nc nebo users_no_opened).

A ač by mi nevadily ty dva sloupce, jak navrhuje Kajman, byť u drtivé většiny uživatelů prázdné, osobně bych šel cestou uvedenou v #2.
MaK
Profil
anonym:
Přesouvání uživatelů mezi tabulkami tak, jak jsi to navrhoval ty, je nesmysl
Přesouvat uživatele mezi tabulkami jsem neměl v plánu. Pouze uživatelé, kteří jsou ve stavu opened_nc mají po dobu pobytu v tomto stavu pomocné informace v druhé tabulce. Ať už se ta tabulka jmenuje users_opened_nc nebo acc_confirmations.
anonym_
Profil *
MaK:
Aha, tak to jsem špatně pochopil tvou myšlenku/vyjádření. Každopádně zbytek mého postu zůstává v platnosti.
Giga
Profil
Udělal bych tabuku kandidátů a do tabulky aktivních bych je zařadil, až by potvrdili svůj zájem.
Tabulku kandidátů bych asi nepromazával a měl bych tak přehled o vícenásobných pokusech o registraci - např. ze strany robotů....

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0