Czy tabela z jedną kolumną jest dobrym projektem? [Zamknięte]


111

Czy można mieć tabelę z tylko jedną kolumną? Wiem, że nie jest to technicznie nielegalne, ale czy jest to uważane za kiepski projekt?

EDYTOWAĆ:

Oto kilka przykładów:

  • Masz tabelę z 50 prawidłowymi kodami stanów USA, ale nie musisz przechowywać pełnych nazw stanów.
  • Czarna lista e-maili.

Ktoś wspomniał o dodaniu pola kluczowego. Tak jak ja to widzę, ta pojedyncza kolumna BYŁAby kluczem podstawowym.


Mam trochę problemów z wyobrażeniem sobie przypadku użycia tabeli z tylko jedną kolumną. Czy możesz podać przykład?
Paul Morie

ale przynajmniej nie twórz dla niego indeksu!
Sathya

3
US Nr stan jest klasycznym przykładem zdefiniowania domeny
Quassnoi

3
Widziałem wcześniej tabelę bazy danych używaną do przechowywania wartości blokady dla aplikacji
Russ Cam,

Użyłem tego wzorca do tworzenia zestawów danych. Każdy rekord w tabeli głównej ma pole SET. Rekordy z tym samym zestawem SET są połączone. Jak wstawić wiele rekordów z tym samym zestawem? „INSERT INTO ustawia VALUES ()”, a następnie użyj ostatniego identyfikatora wstawienia jako identyfikatora zestawu do dołączenia do rekordów. Z drugiej strony, może mogłem użyć identyfikatorów UUID, ale coś w tym jest nie tak.
William Entriken,

Odpowiedzi:


87

Tak, z pewnością dobrym projektem jest zaprojektowanie stołu w taki sposób, aby był jak najbardziej wydajny. „Zły projekt RDBMS” zwykle koncentruje się na nieefektywności.

Jednak odkryłem, że większość przypadków projektowania z jedną kolumną może skorzystać na dodatkowej kolumnie. Na przykład kody stanów mogą zazwyczaj zawierać nazwę pełnego stanu zapisaną w drugiej kolumnie. Albo czarna lista może mieć przypisane notatki. Ale jeśli twój projekt naprawdę nie potrzebuje tych informacji, to idealnie jest mieć pojedynczą kolumnę.


168

W kategoriach relational algebratego byłaby to relacja jednoargumentowa, oznaczająca „ ta rzecz istnieje

Tak, dobrze jest mieć tabelę definiującą taką relację: na przykład w celu zdefiniowania domeny.

Wartości takiej tabeli powinny oczywiście być naturalnymi kluczami głównymi.

prime numbersNajpierw przychodzi mi do głowy tabela przeglądowa .


3
+1: Tabela jest zbiorem wartości, które są prymitywnymi typami twojego RDBMS.
S.Lott,

4
+1 za udzielenie odpowiedzi opartej na teorii relacji.
lubos hasko

Oto dobry przykład schematu, który ma tabelę z jedną kolumną, która nie jest kluczem naturalnym, tabelę wątków w systemie obsługi wiadomości ... stackoverflow.com/a/6542556/45767
JeremyWeir

29

Używałem ich w przeszłości. Jeden z moich klientów chciał automatycznie blokować każdego, kto próbował się zarejestrować za pomocą numeru telefonu z tej dużej listy, którą miał, więc była to tylko jedna duża czarna lista.


19

Jeśli istnieje taka potrzeba, to nie widzę problemu. Może z jakiegoś powodu chcesz po prostu wyświetlić listę możliwości i chcesz mieć możliwość jej dynamicznej zmiany, ale nie musisz łączyć jej z inną tabelą.


+1 - Podsumowując, to jest właściwa odpowiedź w mojej książce
Mark Brittingham

+1 za zwięzłą, jasną odpowiedź.
Matthew Jones

3
Dlaczego nie można połączyć jednej tabeli kolumnowej z inną tabelą?
Aheho

2
Dlaczego nie? Jako przykład weź tabelę kodów stanów. Dlaczego nie użyłbyś tego jako ograniczenia klucza foriegn dla innej tabeli z polami adresowymi?
Aheho

1
To świetny przykład czasu, że byłby to dobry pomysł.
Kevin

11

Jeden przypadek, który czasami znajdowałem, jest taki:

Tabela country_id , zawiera tylko jedną kolumnę z numerycznym identyfikatorem dla każdego kraju.

Tabela opis_krajów zawiera kolumnę z identyfikatorem kraju, kolumnę z identyfikatorem języka i kolumnę z zlokalizowaną nazwą kraju.

Tabela company_factories , zawiera informacje o każdej fabryce firmy, w tym o kraju, w którym się znajduje.

Aby więc zachować spójność danych i dane niezależne od języka w tabelach, baza danych używa tego schematu z tabelami z tylko jedną kolumną, aby umożliwić klucze obce bez zależności językowych.

W tym przypadku myślę, że istnienie tabel z jedną kolumną jest uzasadnione.

Opracował w odpowiedzi na komentarz: Quassnoi


(źródło: ggpht.com )

W tym schemacie mogę zdefiniować klucz obcy w tabeli company_factories, która nie wymaga umieszczania kolumny Language w tabeli, ale jeśli nie mam tabeli country_id to muszę dołączyć kolumnę Language do tabeli, aby zdefiniować klucz obcy .


2
Dlaczego warto mieć country_id? Aby wstawić kraj, musisz znać jego nazwę w co najmniej jednym języku, a to spowoduje, że identyfikator_kraju pojawi się w opisie_krajów. Identyfikator kraju bez wpisu opis_kraju nie ma znaczenia. „Pan Barack Obama, Prezydent COALESCE (14243, country_name) ZWRÓCONA WARTOŚĆ ZEROWA, spotkał się dzisiaj z Dmitrijem Miedwiediewem, Prezydentem Polski”
Quassnoi

4
@Doliveras: OK, teraz widzę, +1. Wolałbym jednak używać ISO 3166-1 dla coutry_code. W przeciwieństwie do numerycznego identyfikatora, trzyliterowy kod kraju daje wyobrażenie o tym, o jakim kraju mówi się prawie każdemu na świecie, kto potrafi czytać alfabet łaciński.
Quassnoi

Oto inny sposób, który zaimplementowałem, aby umieścić tłumaczenia w języku naturalnym w tej samej tabeli. To prawda, że ​​w rezultacie wiele pól może mieć wartość null, ale można odciążyć integralność danych do niestandardowych wyzwalaczy. CREATE TABLE "DBA" "myLocalisedTable" ( "entry_id" INTEGER NOT NULL DEFAULT AUTOINCREMENT "master_entry_id" INTEGER NULL, "master_entry_label" VARCHAR (200) NULL, "language_id" INTEGER NULL, "localised_entry_label" VARCHAR (300) null,.
Vincent Buck

7

W rzadkich przypadkach tabela jednokolumnowa ma sens. Zrobiłem jedną bazę danych, w której lista prawidłowych kodów języków była tabelą jednokolumnową używaną jako klucz obcy. Nie było sensu mieć innego klucza, ponieważ sam kod był kluczem. I nie było ustalonego opisu, ponieważ opisy kodu języka różniłyby się w zależności od języka w niektórych kontekstach.

Ogólnie rzecz biorąc, każdy przypadek, w którym potrzebujesz autorytatywnej listy wartości, które nie mają żadnych dodatkowych atrybutów, jest dobrym kandydatem do tabeli jednokolumnowej.


5

Cały czas korzystam z tabel jednokolumnowych - oczywiście w zależności od tego, czy projekt aplikacji korzysta już z bazy danych. Kiedy już wytrzymałem projekt związany z ustanowieniem połączenia z bazą danych, umieściłem wszystkie zmienne dane w tabelach, jeśli to możliwe.

Przychodzą mi do głowy dwa zastosowania jednokolumnowych tabel OTMH:

1) Pozycja danych istnieje. Często używany na listach rozwijanych. Używane również do prostych testów legitymacji.

Na przykład. dwuliterowe skróty stanów USA; Kody pocztowe, do których wysyłamy; słowa legalne w Scrabble; itp.

2) Rzadki atrybut binarny, tj. W dużej tabeli atrybut binarny, który będzie prawdziwy tylko dla kilku rekordów. Zamiast dodawać nową kolumnę logiczną, mógłbym utworzyć osobną tabelę zawierającą klucze rekordów, dla których atrybut jest prawdziwy.

Na przykład. pracownicy cierpiący na śmiertelną chorobę; banki z 360-dniowym rokiem (większość używa 365); itp.

-Glin.



4

Zwykle widziałem to w tabelach typów wyszukiwania, takich jak tabela stanów, którą opisałeś. Jeśli jednak to zrobisz, ustaw kolumnę jako klucz podstawowy, aby wymusić unikalność. Jeśli nie możesz ustawić tej wartości jako unikalnej, nie powinieneś używać jednej kolumny.


Chociaż użycie tutaj jednej kolumny prawdopodobnie jest w porządku, pamiętaj, że możesz ustawić ograniczenia unikalności również dla innych kolumn.
Stealth Rabbi

2

Ogólnie powiedziałbym, że tak. Nie wiem, dlaczego potrzebujesz tylko jednej kolumny. Jest kilka wyjątków od tego, które jak widziałem skutecznie stosowane. To zależy od tego, co próbujesz osiągnąć.

Nie są one dobrym projektem, jeśli myślisz o schemacie bazy danych, ale tak naprawdę powinny być używane tylko jako tabele narzędzi.

W przeszłości widziałem skutecznie używane tabele liczbowe .


1

Celem bazy danych jest powiązanie ze sobą informacji. Jak możesz to zrobić, gdy nie ma danych, do których można by się odnieść?

Może to jest jakaś tabela kompilacji (np. Imię + Nazwisko + Data urodzenia), chociaż nadal nie jestem pewien, dlaczego chcesz to zrobić.

EDYCJA: Widziałem użycie tego rodzaju tabeli do jakiejś prostej listy. Czy do tego go używasz?


9
Nie, głównym celem bazy danych jest przechowywanie informacji.
Spencer Ruport

Ale arkusz kalkulacyjny może przechowywać informacje. Jak przydatne są informacje, jeśli jest to po prostu zbiór niepowiązanych cyfr i liter bez korelacji między nimi?
Matthew Jones

Informacje mogą być przydatne, ponieważ aplikacja korzystająca z bazy danych ich potrzebuje i nie jest to stały zestaw. Oznacza to, że baza danych jest po prostu najwygodniejszym miejscem do umieszczania informacji, które mają być używane przez aplikację bazy danych - relacyjną lub inną. Jestem prawie pewien, że zgodzisz się, że nie tworzymy aplikacji, aby udowodnić naszą czystość w odniesieniu do relacyjnego ideału. Zamiast tego tworzymy aplikacje, aby były użyteczne.
Mark Brittingham

@Mark - to właśnie miałem na myśli, mówiąc o prostej liście. Chyba nie wytłumaczyłem się zbyt dobrze.
Matthew Jones

1
@SR - Nie, głównym celem bazy danych jest pobieranie informacji. Ponieważ interesujące wiersze są często zależne od innych danych, myślę, że oryginalny komentarz MJ jest ważny.
CurtainDog,

1

Tak, o ile pole jest kluczem podstawowym, tak jak powiedziałeś. Powodem jest to, że jeśli wstawisz zduplikowane dane, te wiersze będą tylko do odczytu. Jeśli spróbujesz usunąć jeden z powielonych wierszy. nie zadziała, ponieważ serwer nie będzie wiedział, który wiersz usunąć.


2
To niedorzeczne. Operacja usuwania bez klucza podstawowego lub ograniczenia spowoduje usunięcie wszystkich pasujących wierszy, a nie ich zignorowanie.
Erik Funkenbusch

1
Przez „nie działa” może oznaczać „nie działa zgodnie z oczekiwaniami”, co obejmuje warunek „hej, usunąłem jeden wiersz, ale oba zniknęły”.
GWLlosa

Lub, jeśli spróbujesz usunąć rekord w SSMS z widoku „Otwórz tabelę”, faktycznie wyświetli się okno dialogowe, że rekordu nie można jednoznacznie zidentyfikować, a następnie nic nie zrobisz ...
Michael Fredrickson

-1

Jedynym przykładem użycia, jaki mogę sobie wyobrazić, jest tablica słów, być może dla gry słownej. Uzyskujesz dostęp do tabeli tylko po to, aby sprawdzić, czy ciąg jest słowem: wybierz słowo ze słów, w których słowo =?. Ale istnieją znacznie lepsze struktury danych do przechowywania listy słów niż relacyjna baza danych.

W przeciwnym razie dane w bazie danych są zwykle umieszczane w bazie danych, aby wykorzystać zależności między różnymi atrybutami danych. Jeśli Twoje dane nie mają atrybutów wykraczających poza ich wartość, w jaki sposób rozwinie się ta relacja?

Tak więc, chociaż nie jest to nielegalne, generalnie prawdopodobnie nie powinieneś mieć tabeli z tylko jedną kolumną.


Podobnie jest z tabelą liczb, która jest bardzo przydatna do zatrzymania pętli.
u07ch

-1

Wszystkie moje tabele mają co najmniej cztery pola techniczne, seryjny klucz podstawowy, znaczniki czasu utworzenia i modyfikacji oraz wartości logiczne do miękkiego usuwania. Na dowolnej czarnej liście będziesz również chciał wiedzieć, kto dodał wpis. Więc dla mnie odpowiedź brzmi nie, tabela z tylko jedną kolumną nie miałaby sensu, z wyjątkiem tworzenia prototypów.


1
Wygląda na to, że mieszasz tabelę danych z tabelą transakcji. Moim zdaniem powinny to być dwie odrębne rzeczy.
Josh Noe

-2

Tak, to jest w porządku. ale pole identyfikacyjne nie może tego zranić, prawda?


7
Właściwie to może. Gdy masz ostateczną listę prawidłowych wartości, ostatnią rzeczą, jakiej potrzebujesz, jest pole ID, ponieważ oznacza to, że wartości nie są unikalne. Jeśli „LightBlue” jest kluczem, nie chcesz, aby ktoś pomyślał, że „LightBlue” o identyfikatorze 1 może różnić się od „LightBlue” o identyfikatorze 4.
Jeremy Bourque

Kto powiedział, że Id musi być tożsamością? Albo część klucza?
Eric

3
Może to być klucz syntetyczny, a oryginalne pole może mieć unikalne ograniczenie.
Mark Canlas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.