Pole logiczne w Oracle
Wczoraj chciałem dodać pole logiczne do tabeli Oracle. Jednak w Oracle nie ma w rzeczywistości boolowskiego typu danych. Czy ktoś zna najlepszy sposób na symulację logiki logicznej? Googlowanie obiektu odkryło 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 znakowego z "Y" lub " N " jako jedynymi dwiema wartościami.
Użyj enum z czekiem ograniczenie.
Czy doświadczeni programiści Oracle wiedzą, które podejście jest preferowane / kanoniczne?
8 answers
Znalazłem ten link przydatny.
Oto akapit podkreślający niektóre z zalet / wad każdego podejścia.
Najczęściej spotykanym projektem jest naśladowanie wielu Boolean-like flagi używane przez widoki słownika danych Oracle, wybierając " Y " jako true i " N " jak false. Jednak do prawidłowego współdziałania z hostem środowiska, takie jak JDBC, OCCI i Inne Środowiska programistyczne, lepiej wybrać 0 dla false I 1 dla true, aby mogło działać prawidłowo z funkcjami getBoolean i setBoolean.
W zasadzie opowiadają się za metodą numer 2, ze względu na wydajność, używając
-
wartości 0/1 (ze względu na interoperacyjność z
getBoolean()
JDBC itp.) z ograniczeniem kontrolnym - a Typ znaku (ponieważ używa mniej spacji niż liczby).
Ich przykład:
create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 23:35:44
Oracle używa Y / N dla wartości logicznych. Dla kompletności należy zauważyć, że pl / sql ma typ boolean, to tylko tabele, które nie.
Jeśli używasz pola do wskazania, czy rekord musi być przetworzony, możesz rozważyć użycie Y i NULL jako wartości. Powoduje to bardzo mały (szybki odczyt) indeks, który zajmuje bardzo mało miejsca.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 19:23:39
Aby użyć jak najmniejszej ilości spacji, należy użyć pola znakowego ograniczonego do ' Y ' lub 'N'. Oracle nie obsługuje typów danych typu BOOLEAN, BIT lub tinyint, więc jeden bajt CHAR jest tak mały, jak to tylko możliwe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 13:29:07
Najlepszą opcją jest 0 i 1 (jako liczby - inna odpowiedź sugeruje 0 i 1 jako CHAR dla wydajności przestrzeni, ale to dla mnie trochę zbyt pokręcone), używając NOT NULL i check constraint, aby ograniczyć zawartość do tych wartości. (Jeśli chcesz, aby kolumna była nullable, to nie jest to wartość logiczna, z którą masz do czynienia, ale wyliczenie z trzema wartościami...)
Zalety 0/1:
- język niezależny. "Y" i " N " byłoby w porządku, gdyby wszyscy go używali. Ale nie. we Francji używają "O" I " N " (widziałem to na własne oczy). Nie zaprogramowałem w Finlandii, aby sprawdzić, czy używają tam " E " i " K " - bez wątpienia są mądrzejsi, ale nie możesz być pewien.
- zgodny z praktyką w szeroko używanych językach programowania (C, C++, Perl, Javascript)
- gra lepiej z warstwą aplikacji np. Hibernate
- prowadzi do bardziej zwięzłego SQL, na przykład, aby dowiedzieć się, ile bananów jest gotowych do jedzenia
select sum(is_ripe) from bananas
zamiastselect count(*) from bananas where is_ripe = 'Y'
lub nawet (yuk)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Zalety "Y" / "N":
- zajmuje mniej miejsca niż 0/1
- to sugeruje Oracle, więc może być to, do czego niektórzy ludzie są bardziej przyzwyczajeni
Inny plakat sugerował 'Y' / null dla zysków wydajności. Jeśli masz udowodnione , że potrzebujesz wydajności, to w porządku, ale w przeciwnym razie unikaj, ponieważ to sprawia, że zapytania są mniej naturalne (some_column is null
zamiast some_column = 0
) i w lewym połączeniu połączysz fałsz z nieistniejącymi rekordami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 07:32:22
Albo 1/0 albo Y / N z ograniczeniem kontrolnym. ether way jest w porządku. Ja osobiście wolę 1/0, ponieważ wykonuję dużo pracy w Perlu, a to naprawdę ułatwia wykonywanie operacji boolowskich Perla na polach bazy danych.
Jeśli chcesz naprawdę dogłębnej dyskusji na ten temat z jednym z wyroczni głowy honchos, sprawdź, co Tom Kyte ma do powiedzenia na ten temat Tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-31 17:11:47
Baza danych, nad którą wykonałem większość mojej pracy, używała 'Y' / ' N ' jako booleanów. Dzięki tej implementacji możesz wykonać kilka trików, takich jak:
-
Liczba wierszy, 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 prawdą, to wszystkie są prawdą":
WYBIERZ MAX (BOOLEAN_FLAG) Z Y
Odwrotnie, użyj MIN, aby wymusić grupowanie false, Jeśli jeden wiersz jest false.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 13:36:23
Roboczy przykład implementacji zaakceptowanej odpowiedzi poprzez dodanie kolumny "Boolean" do istniejącej tabeli w bazie danych oracle (przy użyciu typu number
):
ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);
Tworzy to nową kolumnę w my_table_name
o nazwie my_new_boolean_column
z domyślnymi wartościami 0. Kolumna nie akceptuje wartości NULL
i ogranicza akceptowane wartości do 0
lub 1
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 17:07:00
W naszych bazach danych używamy enum, które zapewnia, że przekazujemy je albo TRUE, albo 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 znaków o wartościach Y, y, N, n, T, t, F, F i pamiętać, która sekcja kodu używa tabeli i która wersja true jest używana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 13:22:06