2008-10-16 14 views
11

Mam aplikację internetową, która powiadamia użytkowników o aktywności na stronie za pośrednictwem poczty elektronicznej. Użytkownicy mogą wybrać rodzaje powiadomień, które chcą otrzymywać. Jak dotąd istnieje około 10 różnych opcji (każda z nich jest prawdziwa/fałszywa).Najlepszy sposób na przechowywanie wielu flag w bazie danych

Aktualnie przechowuję to w jednym polu varchar jako 0 lub 1 oddzielone przecinkami. Na przykład: 1,0,0,0,1,1,1,1,0,0

Działa to, ale trudno jest dodać nowe flagi powiadomień i śledzić, która flaga należy do którego powiadomienia. Czy istnieje odpowiedni standard do robienia tego? Myślałem o dodaniu kolejnej tabeli z kolumną dla każdego typu powiadomienia. Następnie mogę dodać nowe kolumny, jeśli potrzebuję, ale nie jestem pewien, jak jest to skuteczne.

Z góry dzięki!

Odpowiedz

20

Chciałbym użyć dwóch tabel. Jedna tabela będzie przechowywać dane użytkownika, a druga powiadomienia, które subskrybują. Druga tabela będzie wyglądać mniej więcej tak:

create table notifications (
    user_id int, 
    notification_type int 
); 

bym zrobić relację pomiędzy FK user_id i identyfikator użytkownika w tabeli użytkowników z kaskadą Delete. Użyj zarówno id_użytkownika, jak i typ_instancji jako klucza podstawowego. Aby sprawdzić, czy użytkownik chce określonego powiadomienia, po prostu wykonaj połączenie między dwiema tabelami i wybierz wiersze, w których typ_rejestracji pasuje do danego. Jeśli zestaw wyników nie jest pusty, użytkownik chce otrzymać powiadomienie.

Dodawanie nowych powiadomień staje się banalne (podobnie jak usuwanie). Po prostu dodaj (usuń) nową wartość typu i pozwól użytkownikom na jej zaakceptowanie. Jeśli chcesz zachować typy powiadomień w tabeli, aby zarządzać za pomocą aplikacji, która również zadziała, ale byłoby to trochę bardziej skomplikowane.

+0

Wydaje się, że to zdecydowanie najlepsze rozwiązanie IMO. Przechowywanie ich wszystkich w jednej kolumnie nie jest bardzo rozszerzalne. Przechowywanie ich w polach boolowych w tabeli oznacza, że ​​musisz dodać nowe pole za każdym razem, gdy pojawi się nowy typ powiadomienia. – Craig

+0

To działałoby dobrze, szczególnie jeśli chcesz móc skanować typy powiadomień. – BCS

+0

Normalizacja jest świetna dla rozszerzalności, ale ma niewielki wpływ na wydajność. – stephenbayer

0

Spodziewałbym się, że pozwolenie DB zarządzać nim przy użyciu kolumn Bool byłoby lepiej. Przypominam sobie, że niektóre systemy będą pakowały boole na bity (null może to zepsuć). Aby uniknąć bałaganu, możesz utworzyć oddzielną tabelę.

(nie jestem DBA)

Edit: klepnięcia głowie "Właśnie dokładnie to, co sugeruje jesteś rzeczą": b

2

użyłbym 10 różnych pól bitowych lub bool. Ale jeśli masz zamiar zrobić to w jednym polu, możesz użyć mapy bitowej 0x1111111111 jako dużej liczby całkowitej lub pola tekstowego bez przecinka. Pracowałem nad różnymi aplikacjami, używając wszystkich tych technik. Ale tak naprawdę po prostu pójdę z wieloma polami. O wiele łatwiej będzie robić wyselekcjonowane instrukcje.

0

Jeśli nie zdecydował się skorzystać z pola bitowego jak @stephenbayer wspomniano zawsze można użyć widoku na stole, aby ułatwić programistom używać wtedy Oznacza to, że nadal masz oszczędności przestrzenne pole bitowe i łatwość użycia oddzielnych kolumn na pole i przy unikaniu konieczności analizowania kolumny:

Jak wspomniano, oddzielna tabela jest doskonałą opcją, jeśli chcesz, aby Twoje rozwiązanie było bardziej rozszerzalne.Jedynym minusem jest nieco większa złożoność.

To jest kompromis. Jeśli chcesz czegoś, co jest naprawdę łatwe do wdrożenia i jest szybkie, rozważ pole bitowe. Jeśli chcesz czegoś, co jest łatwiejsze do rozszerzenia i utrzymania kosztem nieco większej złożoności, to na wszelki wypadek przejdź do oddzielnej tabeli. Jeśli w głosach powiesz coś, co prawdopodobnie chcesz zastosować do oddzielnej implementacji tabeli.

Powiązane problemy