Frage

Gestern wollte ich einer Oracle-Tabelle ein boolesches Feld hinzufügen.Allerdings gibt es in Oracle eigentlich keinen booleschen Datentyp.Weiß hier jemand, wie man einen Booleschen Wert am besten simuliert?Beim Googeln des Themas wurden mehrere Ansätze entdeckt

  1. Verwenden Sie eine Ganzzahl und machen Sie sich nicht die Mühe, ihr etwas anderes als 0 oder 1 zuzuweisen.

  2. Verwenden Sie ein Char-Feld mit „Y“ oder „N“ als den einzigen beiden Werten.

  3. Verwenden Sie eine Aufzählung mit der CHECK-Einschränkung.

Wissen erfahrene Oracle-Entwickler, welcher Ansatz bevorzugt/kanonisch ist?

War es hilfreich?

Lösung

ich fand Das Link nützlich.

Hier ist der Absatz, der einige der Vor- und Nachteile jedes Ansatzes hervorhebt.

Das am häufigsten gesehene Design besteht darin, die vielen booleschen Flags zu imitieren, die die Datenwörterbuchansichten von Oracle verwenden und 'Y' für True und 'n' für false auswählen.Um jedoch mit Hostumgebungen wie JDBC, OCCI und anderen Programmierumgebungen korrekt zu interagieren, ist es besser, 0 für False und 1 für True auszuwählen, damit es mit den Funktionen von Getboolen und Setboolen korrekt funktionieren kann.

Grundsätzlich befürworten sie aus Effizienzgründen die Methode Nummer 2

  • Werte von 0/1 (aufgrund der Interoperabilität mit JDBCs). getBoolean() usw.) mit einer Check-Einschränkung
  • A Typ von CHAR (da es weniger Platz benötigt als NUMBER).

Ihr Beispiel:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

Andere Tipps

Oracle selbst verwendet Y/N für boolesche Werte.Der Vollständigkeit halber sei angemerkt, dass pl/sql einen booleschen Typ hat, nur Tabellen haben dies nicht.

Wenn Sie das Feld verwenden, um anzugeben, ob der Datensatz verarbeitet werden muss oder nicht, können Sie die Verwendung von Y und NULL als Werte in Betracht ziehen.Dies führt zu einem sehr kleinen (schnell lesbaren) Index, der sehr wenig Platz beansprucht.

Um möglichst wenig Platz zu beanspruchen, sollten Sie ein CHAR-Feld verwenden, das auf „Y“ oder „N“ beschränkt ist.Oracle unterstützt die Datentypen BOOLEAN, BIT oder TINYINT nicht, daher ist das Byte von CHAR so klein wie möglich.

Die beste Option ist 0 und 1 (als Zahlen – eine andere Antwort schlägt 0 und 1 als vor VERKOHLEN aus Platzgründen, aber das ist mir etwas zu verdreht), indem ich NOT NULL und eine Check-Einschränkung verwende, um den Inhalt auf diese Werte zu beschränken.(Wenn die Spalte nullwertfähig sein soll, handelt es sich nicht um einen booleschen Wert, sondern um eine Aufzählung mit drei Werten ...)

Vorteile von 0/1:

  • Sprachunabhängig.„Y“ und „N“ wären in Ordnung, wenn jeder es verwenden würde.Aber das tun sie nicht.In Frankreich verwendet man „O“ und „N“ (das habe ich mit eigenen Augen gesehen).Ich habe in Finnland nicht programmiert, um zu sehen, ob dort „E“ und „K“ verwendet werden – zweifellos sind sie schlauer, aber Sie können nicht sicher sein.
  • Kongruent mit der Praxis in weit verbreiteten Programmiersprachen (C, C++, Perl, Javascript)
  • Funktioniert besser mit der Anwendungsschicht, z. B.Überwintern
  • Führt zu prägnanterem SQL, um beispielsweise herauszufinden, wie viele Bananen essfertig sind select sum(is_ripe) from bananas anstatt select count(*) from bananas where is_ripe = 'Y' oder sogar (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Vorteile von „Y“/„N“:

  • Nimmt weniger Platz ein als 0/1
  • Es ist das, was Oracle vorschlägt, und vielleicht ist es das, woran einige Leute eher gewöhnt sind

Ein anderer Poster schlug „Y“/Null für Leistungssteigerungen vor.Wenn ja bewiesen dass Sie die Leistung benötigen, dann ist das in Ordnung, aber ansonsten vermeiden Sie es, da es die Abfrage weniger natürlich macht (some_column is null anstatt some_column = 0) und in einem Left-Join verbinden Sie Falschheit mit nicht vorhandenen Datensätzen.

Entweder 1/0 oder J/N mit einer Prüfeinschränkung.Ätherischer Weg ist in Ordnung.Ich persönlich bevorzuge 1/0, da ich viel in Perl arbeite, und es macht es wirklich einfach, boolesche Perl-Operationen an Datenbankfeldern durchzuführen.

Wenn Sie eine wirklich ausführliche Diskussion dieser Frage mit einem der Chefbosse von Oracle wünschen, schauen Sie sich an, was Tom Kyte dazu zu sagen hat Hier

Die Datenbank, an der ich die meiste Arbeit gemacht habe, verwendete „Y“ / „N“ als boolesche Werte.Mit dieser Implementierung können Sie einige Tricks anwenden wie:

  1. Zählen Sie die Zeilen, die wahr sind:
    SELECT SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X

  2. Erzwingen Sie beim Gruppieren von Zeilen die Logik „Wenn eine Zeile wahr ist, sind alle wahr“:
    SELECT MAX(BOOLEAN_FLAG) FROM Y
    Umgekehrt können Sie mit MIN die Gruppierung als falsch erzwingen, wenn eine Zeile falsch ist.

Ein funktionierendes Beispiel zum Implementieren der akzeptierten Antwort durch Hinzufügen einer „Booleschen“ Spalte zu einer vorhandenen Tabelle in einer Oracle-Datenbank (unter Verwendung von number Typ):

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))
);

Dadurch wird eine neue Spalte erstellt my_table_name angerufen my_new_boolean_column mit Standardwerten von 0.Die Spalte wird nicht akzeptiert NULL Werte und beschränkt die akzeptierten Werte auf beide 0 oder 1.

In unseren Datenbanken verwenden wir eine Enumeration, die sicherstellt, dass wir entweder TRUE oder FALSE übergeben.Wenn Sie es auf eine der ersten beiden Arten tun, ist es zu einfach, der Ganzzahl eine neue Bedeutung hinzuzufügen, ohne einen richtigen Entwurf durchzugehen, oder am Ende dieses Zeichenfeld mit Y, y, N, n, T, t zu erhalten. F, f-Werte und man muss sich merken, welcher Codeabschnitt welche Tabelle verwendet und welche Version von true er verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top