Wczoraj chciałem dodać pole boolowskie do tabeli Oracle. Jednak w rzeczywistości nie ma logicznego typu danych w Oracle. Czy ktoś tutaj zna najlepszy sposób na symulację wartości logicznej? Wyszukiwanie tematu w Google pozwoliło odkryć kilka podejść
Użyj liczby całkowitej i po prostu nie przejmuj się przypisywaniem do niej niczego innego niż 0 lub 1.
Użyj pola znaku z „Y” lub „N” jako jedynymi dwiema wartościami.
Użyj wyliczenia z ograniczeniem CHECK.
Czy doświadczeni programiści Oracle wiedzą, które podejście jest preferowane / kanoniczne?
oracle
boolean
sqldatatypes
Eli Courtwright
źródło
źródło
wall
typu danych, abym mógł rozbić sobie głowę, używając wartości logicznych.Odpowiedzi:
Ten link okazał się przydatny.
Oto akapit przedstawiający niektóre zalety / wady każdego podejścia.
Zasadniczo opowiadają się za metodą numer 2, ze względu na wydajność, używając
getBoolean()
itp.) z ograniczeniem sprawdzającymIch przykład:
źródło
Sama Oracle używa Y / N dla wartości logicznych. Dla kompletności należy zauważyć, że pl / sql ma typ boolowski, tylko tabele go nie mają.
Jeśli używasz tego pola do wskazania, czy rekord ma zostać przetworzony, czy nie, możesz rozważyć użycie Y i NULL jako wartości. To sprawia, że indeks jest bardzo mały (szybki), który zajmuje bardzo mało miejsca.
źródło
Aby wykorzystać jak najmniej miejsca, należy użyć pola CHAR ograniczonego do „Y” lub „N”. Oracle nie obsługuje typów danych BOOLEAN, BIT ani TINYINT, więc jeden bajt CHAR jest tak mały, jak to tylko możliwe.
źródło
Najlepszą opcją jest 0 i 1 (jako liczby - inna odpowiedź sugeruje 0 i 1 jako CHAR dla wydajności przestrzennej, ale jest to dla mnie trochę zbyt pokręcone), używając NOT NULL i ograniczenia sprawdzającego, aby ograniczyć zawartość do tych wartości. (Jeśli chcesz, aby kolumna miała wartość null, to nie jest to wartość logiczna, z którą masz do czynienia, ale wyliczenie z trzema wartościami ...)
Zalety 0/1:
select sum(is_ripe) from bananas
zamiastselect count(*) from bananas where is_ripe = 'Y'
lub nawet (fuj)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Zalety „Y” / „N”:
Inny plakat sugerował „Y” / null w celu zwiększenia wydajności. Jeśli udowodnisz , że potrzebujesz wydajności, to wystarczy, ale w przeciwnym razie unikaj, ponieważ sprawia, że zapytania są mniej naturalne (
some_column is null
zamiastsome_column = 0
), a w złączeniu po lewej stronie połączysz fałsz z nieistniejącymi rekordami.źródło
1/0 lub T / N z ograniczeniem sprawdzającym. sposób eteru jest w porządku. Osobiście wolę 1/0, ponieważ wykonuję dużo pracy w perlu i bardzo ułatwia to wykonywanie operacji logicznych w perlu na polach bazy danych.
Jeśli chcesz naprawdę dogłębnie omówić tę kwestię z jednym z szefów Oracles, sprawdź, co ma do powiedzenia na ten temat Tom Kyte Tutaj
źródło
Baza danych, na której wykonywałem większość swojej pracy, używała „Y” / „N” jako wartości logicznych. Dzięki tej implementacji możesz wykonać kilka sztuczek, takich jak:
Policz wiersze, które są prawdziwe:
SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X
Podczas grupowania wierszy
wymuś logikę „Jeśli jeden wiersz jest prawdziwy, wszystkie są prawdziwe”: SELECT MAX (BOOLEAN_FLAG) FROM Y
I odwrotnie, użyj MIN, aby wymusić grupowanie fałszywe, jeśli jeden wiersz jest fałszywy.
źródło
Roboczy przykład implementacji zaakceptowanej odpowiedzi poprzez dodanie kolumny „Boolean” do istniejącej tabeli w bazie danych Oracle (przy użyciu
number
typu):To tworzy nową kolumnę
my_table_name
o nazwiemy_new_boolean_column
z domyślnych wartości 0. kolumna nie będzie akceptowaćNULL
wartości i ogranicza wartości zgodził się albo0
albo1
.źródło
W naszych bazach danych używamy wyliczenia, które zapewnia, że przekażemy je TRUE lub FALSE. Jeśli zrobisz to na jeden z dwóch pierwszych sposobów, zbyt łatwo jest zacząć dodawać nowe znaczenie do liczby całkowitej bez przechodzenia przez odpowiedni projekt lub skończyć z tym polem znaku mającym Y, y, N, n, T, t, Wartości F, f i konieczność zapamiętania, która sekcja kodu używa której tabeli i której wersji true używa.
źródło