2011-01-12 8 views
8

Mam kilka tabel, takich jak Buyers, Shops, Brands, Money_Collectors, e.t.c.Jaka jest najlepsza metoda przechowywania wartości domyślnych w bazie danych?

Każda z nich ma wartość domyślną, np. domyślny Buyer jest David, domyślny Shop jest Ebay, i tak dalej.

Chciałbym zapisać te wartości domyślne w bazie danych (aby użytkownik mógł je zmienić).

Pomyślałem, aby dodać kolumnę is_default do każdej z tabel, ale wydaje się ona nieskuteczna, ponieważ tylko jeden wiersz w każdej tabeli może być domyślny.

Potem pomyślałem, że najlepiej będzie mieć tabelę Defaults, która będzie zawierała wszystkie wartości domyślne. Tabela ta będzie mieć 1 wiersz i n kolumn, gdzie n oznacza liczbę od wartości domyślnych:

Defaults table: 

buyer  shop  brand  money_collector 
-----  ----  -----  --------------- 
David  Ebay  Dell  NULL (no default value) 

Ale to nie wydaje się być najlepszym rozwiązaniem, ponieważ struktura tabeli zmienia się, kiedy nowa wartość domyślna jest dodawany.

Jakie byłoby najlepsze podejście do przechowywania wartości domyślnych?

+3

Po pierwsze, co robi wartość domyślna? Po drugie, czy jest to wartość domyślna dla jednej tabeli czy jedna dla każdego użytkownika? Kiedy mówisz (aby użytkownik mógł je zmienić) wydaje się, że KAŻDY użytkownik miałby zestaw wartości domyślnych. Czy masz na myśli, że użytkownik ADMIN może zmienić ustawienia domyślne? Na koniec, czemu sprzeciwiasz się kolumnie is_default? Jaki byłby problem z tym? –

+0

W moim przypadku, każda tabela przechowuje wszystkie możliwe wartości pola wyboru. W każdym polu wyboru znajduje się jedna wartość domyślna (lub zero, jeśli nie ma wartości domyślnej). Nie mam nic przeciwko użytkownikom. Załóżmy, że tylko jeden użytkownik (np. Admin) może zmienić domyślną. Jeśli chodzi o kolumnę 'is_default': załóżmy, że jest 50 sklepów (pole wyboru z 50 możliwymi wartościami). W tym przypadku do przechowywania domyślnego sklepu potrzebujesz 50 pól logicznych, a nie 1. Innymi słowy, nie chcę wydawać miejsca. Czy nie powinienem martwić się o miejsce podczas zapisywania danych w bazie danych? –

+0

Jak chcesz, aby domyślny działał? Czy jest to dla interfejsu użytkownika, aby pole wyboru sklepów domyślnie było ustawione na Ebay? Czy jest to dla zaplecza bazy danych, aby przechowywać Ebay w sklepie, jeśli użytkownik nie wybrał sklepu? –

Odpowiedz

18

Po to, żeby być czystym.

Najlepszym sposobem jest kolumna na każdej tabeli, z której rozwijane są źródła.

A oto dlaczego ...

"nie powinien się martwić o miejsce, gdy Zapisywanie danych w bazie danych?"

Krótka odpowiedź brzmi: nie. Dłuższą odpowiedzią jest powód do obaw. Koncentrowanie się na kosmosie doprowadzi cię do robienia bardzo złych rzeczy.

Złe rzeczy, które możesz zrobić, jeśli przestrzeń jest problemem.

  • Pogrzebacie znaczenie w kluczach podstawowych. tj. inteligentne klucze.
  • Będziesz próbował przechowywać wartości mulitple w jednej kolumnie.
  • Będziesz indeks zbyt mało
  • (bez wątpienia moglibyśmy stworzyć listę 50 złych praktyk, które oszczędzają przestrzeń)

Załóżmy, że istnieją 50 sklepy (zaznacz pole z 50 możliwych wartości) . W tym przypadku, aby zapisać domyślny sklep ty potrzebę 50 boolean Fields,

No to ONE logiczna kolumna. Istnieje w każdym rzędzie.

Pozwól, że Cię o to zapytam. Jeśli utworzyłeś tabelę z 1 kolumną z datą i wstawiłeś 1 wiersz, ile miejsca chcesz użyć na dysku?

Jeśli powiedziałeś 7 lub 8 bajtów, to jesteś wyłączony około 1000 razy.

Najmniejsza jednostka miejsca na dysku to blok. Bloki są typowymi 8 KB (the może być tak mały, jak 2KB tak duże jak 32KB, w ogóle (bez nitpicking tutaj, rzeczywiste granice są nieistotne))

Powiedzmy masz 8kB bloki wówczas 1 kolumna 1 wiersz tabela zajmuje 8Kb. Jeśli wstawisz kolejne 999 wierszy, to nadal będzie to 8KB. (Znowu nie nitpicking jest narzut na blok, a za wiersz - to przykład)

Więc w swoim wyglądzie górę tabeli z 50 nazw sklepów, prawdopodobieństwo, że dodanie 50 bajtów do wielkości sił stołowych do rozwinięcia od 1 bloku do 2 jest niewielkie lub zupełnie nieistotne.

Z drugiej strony, domyślna tabela z pewnością zajmie co najmniej jeden dodatkowy blok. Ale najgorsze trafienie na PERFORMANCE polega na tym, że Twój telefon, aby wypełnić listę rozwijaną, będzie wymagał dwóch podróży w obie strony do bazy danych, jednej do uzyskania listy, drugiej do uzyskania wartości domyślnej. (tak, możesz być w stanie zrobić to w jednym, ale przejść z nim)

Dzięki temu zaoszczędziłeś dokładnie zero miejsca i podwoiłeś ruch sieciowy.

Widzisz, co mówię.


Innym kluczowe powód, aby przestać się martwić o miejsca to dajesz się jasność. pomyśl o programiście, którego zamierzasz zatrudnić, aby uruchomić tę aplikację. Kiedy dołącza do zespołu i patrzy na bazę danych, wyobraź sobie dwa scenariusze.

  1. Istnieje kolumna logiczna o nazwie DEFAULT_VALUE
  2. Istnieje stół bez relacji do wszystkiego, co jest nazwane Default_Values ​​

Pytasz mu zbudować nowy na z listy rozwijanej dla „sklepu”.

W scenariuszu 1 znajduje tabelę magazynu, wyświetla listę rozwijaną w prostym zapytaniu do tabeli i używa pola default_value do wyboru wartości początkowej.

W scenariuszu 2, bez jakiegoś szkolenia, jak on będzie wiedział, aby szukać oddzielnej tabeli? Może on zobaczy ten stół, ale do czasu, gdy będziesz zatrudniany, twój datamodel ma teraz setki stołów.

Ponownie, trochę wymyślne, ale punkt jest istotny. Klarowność w bazie danych jest dobra, warta bajta na wiersz.


rzeczy techniczne

Nie jestem facetem, ale w MySQL Oracle, null kolumna na końcu rzędu podjąć żadnej dodatkowej przestrzeni. W Oracle użyłbym Varchar2 (1) i niech 'T' = Default i pozostawi pozostałe null. To by miało wpływ tylko na użycie 1 bajtu sumy dodatkowej, a nie na wiersz. YMMV z MySQL, możesz zadać to pytanie osobno, jeśli nie możesz znaleźć odpowiedzi w Google.

Ale czas, aby się o to martwić, dotyczy milionów wierszy, a nie setek. Dowolny stół, który podaje rozwijane menu, nigdy nie będzie wystarczająco duży, aby zacząć martwić się o dodatkowe bajty.

+0

W MySQL NULL VARCHAR (n <= 255) zajmuje jeden bajt. TINYINT (który jest synonimem BOOLEAN w MySQL) będzie równie dobrze działać. – Mchl

+0

Odpowiadasz na komentarz, a nie na pytanie. –

+0

To nadal jest dobra rada dotycząca faktycznego pytania. – Mchl

0

Należy raczej stworzyć aa tabeli z dwoma kolumnami i N wierszy

Defaults table: 
buyer, David 
shop, Ebay, 
brand, Dell 

W ten sposób można dodać nowe wartości bez konieczności zmiany struktury tabeli

+0

Jakie typy powinny być kolumnami? –

+0

'VARCHAR' będzie działał najlepiej Przypuszczam, że – Mchl

+1

Ale co, jeśli niektóre tabele tabel zawiera liczby lub booleans? –

1

Co jeśli tworzenia XML, a następnie zapisać, że XML w tabeli w kolumnie XML. Kolumna XML zawierałaby XML, a XML mógł zawierać tagi tabel i podrzędny węzeł wartości domyślnych.

0

Można utworzyć tabelę katalogowy (jakieś tabeli metadanych) zawierający domyślne wartości jak ciągi dla żądanych kolumn tabeli. Następnie możesz użyć funkcji convert, aby uzyskać odpowiednią wartość. Poniżej znajduje się tabela definicja próbki (Transact-SQL był używany):

create table dbo.cat_default_values 
(
    id_column  varchar(30) not null, 
    id_table  varchar(30) not null,  
    datatype  varchar(30) not null,  
    value   varchar(100) not null,  
    f_creation  datetime  not null, 
    usr_creation char(8)  null,  
    primary key clustered (id_column, id_table) 
)  

declare @defaultValueInt int, 
     @defaultValueVarchar varchar(30) 

select @defaultValueInt = convert(int, value) 
    from cat_default_values where id_column = "defColumInteger" and id_table = "table1" 

select defaultValueVarchar = value 
    from cat_default_values where id_column = "defColumVarchar" and id_table = "table1" 
0

Co próbujesz sklepie nie jest meta dane informacje. Przede wszystkim, więc nie będę wymyślał zewnętrznego magazynu danych do przechowywania tych danych (w połączeniu z dodatkowym kodem)

Zakładam, że masz logikę generacji PK PK (pod twoją kontrolą). Przydzielę magiczną liczbę x, a ja wstawię rekord do każdej tabeli z _id = x jako wartością domyślną. Jeśli więc chcesz pokazać użytkownikowi wartość domyślną, możesz obsłużyć zapytanie w sposób jednolity lub możesz obsłużyć to w logice aplikacji podczas wstawiania. Dobrą rzeczą jest to, że masz cały czas dostęp do wartości domyślnej i bez pisania dodatkowej logiki, a logika utrzymywania wartości domyślnej tabeli może być utrzymana przy użyciu tego samego kodu (szablonów;) (Z lekcji W3c dowiedziałem się od modelowania informacji o schemacie XML przy użyciu DTD.)

Tylko przy połowach, logika ta powinna być wyraźna albo za pomocą obszernej dokumentacji, albo może być trudna narzucona przez użycie wyzwalacza.