Mehr

Wie kann ich in QGIS den Feldtyp einer Attributtabelle von String in Double ändern?


Ich arbeite mit QGIS 2.2 und kann meine Attributtabelle nicht bearbeiten, um den Feldtyp von String in Double zu ändern.

Ich habe mehrere Tutorials durchgemacht. - Ich kann das Tabellenmanager-Plugin nicht ausführen, wahrscheinlich weil seine neueste Version für qgis 2.0 ist (nun, es scheint auf meiner Plugin-Manager-Benutzeroberfläche defekt zu sein).

  • Ich kann meine Ebene nicht bearbeiten, damit ich den Feldrechner verwenden kann (wie in mehreren Tutorials vorgeschrieben).

  • Ich bin nicht mit Python vertraut, um die Python-Konsole zu verwenden


Erstellen Sie dazu vorzugsweise ein weiteres Feld mit dem Typ Double und kopieren Sie das Zeichenfolgenfeld darin. Im nächsten Bild habe ich beispielsweise das Zeichenfolgenfeld 'myString' (Bearbeitungssitzung) erstellt und den Wert "5.78453" eingegeben. Sie können bestätigen, dass der Typ String ist, da er linksbündig ist.

In der folgenden Abbildung ist die Erstellung des Feldes "myDouble" (Bearbeitungssitzung) und das Klonen ihrer Werte aus dem Feld "myString" zu sehen.

Nach Enter ist zu sehen, dass das Feld 'myDouble' wie erwartet erstellt wurde (und das Feld 'myString' gelöscht werden kann).


Zusamenfassend: Es ist möglich mit dem Befehl alter column NUR wenn der geänderte Datentyp kompatibel ist mit neu modifiziertem. Darüber hinaus wird empfohlen, die Transaktion durchzuführen.

Beispiel: Sie können eine Spalte von varchar(50) in nvarchar(200) ändern, mit einem Skript unten.

Bearbeiten: Bezüglich Ihres geposteten Fehlers beim Ändern des Spaltentyps.

** Fehler beim Konvertieren des Datentyps nvarchar in Float. **

Eine Möglichkeit wäre, eine neue Spalte zu erstellen und alle guten (wandelbar und kompatibel) Datensätze in neue Spalte. Danach möchten Sie möglicherweise die fehlerhaften Datensätze bereinigen, die nicht konvertiert werden, die alte Spalte löschen und Ihre neu hinzugefügte und gefüllte Spalte wieder in den ursprünglichen Namen umbenennen. Wichtig: Verwenden Sie zuerst die Testumgebung für alle diese Manipulationen. Normalerweise ist das Spielen mit Produktionstischen eine schlechte Übung, um Dinge zu vermasseln.

Verweise um nach weiteren Diskussionen zu ähnlichen SE-Beiträgen zu suchen:


Um Änderungen an der vorhandenen Datenbank vorzunehmen, können Sie den Spaltentyp ändern, indem Sie change() bei der Migration verwenden.

Das können Sie tun

Bitte beachten Sie, dass Sie hinzufügen müssen Lehre/dbal Abhängigkeit von Composer.json Weitere Informationen finden Sie hier http://laravel.com/docs/5.1/migrations#modifying-columns

Die Standardlösung hat bei mir nicht funktioniert, als ich den Typ von geändert habe TEXT zu LANGTEXT.

Dies könnte ein doktrinäres Problem sein. Mehr Informationen hier.

Eine andere Möglichkeit besteht darin, die Methode string() zu verwenden und den Wert auf die maximale Länge des Texttyps zu setzen:

2018 Lösung, noch andere Antworten sind gültig, aber Sie müssen keine Abhängigkeit verwenden:

Zuerst müssen Sie eine neue Migration erstellen:

Versuchen Sie dann in dieser Migrationsdatei up() :

Wenn Sie die Größe nicht ändern, ist die Standardgröße varchar(191), aber wenn Sie die Größe des Felds ändern möchten:

alle anderen Antworten sind richtig Aber Bevor du rennst

Stellen Sie sicher, dass Sie diesen Code zuerst ausführen

RuntimeException : Das Ändern von Spalten für die Tabelle "items" erfordert die Installation von Doctrine DBAL "doctrine/dbal".

Erster Komponist benötigt Doktrin/dbal , dann:

Nicht wirklich eine Antwort, sondern nur eine Anmerkung zu ->change() :

Nur die folgenden Spaltentypen können „geändert“ werden: bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger und unsignedSmallInteger.

Wenn Ihre Spalte nicht zu diesen gehört, müssen Sie entweder die Spalte löschen oder die alter-Anweisung verwenden, wie in anderen Antworten erwähnt.


Kann ich ein privates schreibgeschütztes Feld in C# mithilfe von Reflektion ändern?

Ich stimme den anderen Antworten zu, dass es funktioniert allgemein und vor allem mit dem Kommentar von E. Lippert, dass dies kein dokumentiertes Verhalten und damit kein zukunftssicherer Code ist.

Allerdings ist uns noch ein weiteres Problem aufgefallen. Wenn Sie Ihren Code in einer Umgebung mit eingeschränkten Berechtigungen ausführen, erhalten Sie möglicherweise eine Ausnahme.

Wir hatten gerade einen Fall, in dem unser Code auf unseren Computern gut funktionierte, wir jedoch eine VerificationException erhalten haben, als der Code in einer eingeschränkten Umgebung ausgeführt wurde. Der Täter war ein Reflexionsaufruf an den Setter eines schreibgeschützten Feldes. Es funktionierte, als wir die schreibgeschützte Einschränkung dieses Felds entfernten.

Sie haben gefragt, warum Sie die Kapselung so aufbrechen wollen.

Ich verwende eine Entity-Helper-Klasse, um Entitäten zu hydratisieren. Dies verwendet Reflektion, um alle Eigenschaften einer neuen leeren Entität abzurufen, und ordnet den Eigenschafts-/Feldnamen der Spalte in der Ergebnismenge zu und legt sie mithilfe von propertyinfo.setvalue() fest.

Ich möchte nicht, dass jemand anderes den Wert ändern kann, aber ich möchte auch nicht den ganzen Aufwand aufwenden, um Hydratationsmethoden für jede Entität anzupassen.

Meine vielen meiner gespeicherten Prozeduren geben Ergebnismengen zurück, die nicht direkt Tabellen oder Ansichten entsprechen, daher tun die Code-Gen-ORMs nichts für mich.

Ich habe gerade einen Tag damit verbracht, einen surrealen Fehler zu beheben, bei dem Objekte nicht ihren eigenen deklarierten Typ haben konnten.

Das Ändern des schreibgeschützten Felds hat einmal funktioniert. Aber wenn Sie versuchen, es erneut zu ändern, erhalten Sie Situationen wie diese:

Dies war auf der Mono-Laufzeit (Unity-Spiele-Engine).

Eine andere einfache Möglichkeit, dies zu tun, verwenden Sie unsafe (oder Sie könnten das Feld über DLLImport an eine C-Methode übergeben und dort festlegen).

Die Antwort ist ja, aber noch wichtiger:

Warum willst du? Die Kapselung absichtlich aufzubrechen, scheint mir eine schrecklich schlechte Idee zu sein.

Die Verwendung von Reflexion zum Ändern eines schreibgeschützten oder konstanten Felds ist wie das Kombinieren des Gesetzes der unbeabsichtigten Folgen mit dem Murphy-Gesetz.

Ich möchte nur hinzufügen, dass Sie Folgendes verwenden können, wenn Sie dies für Komponententests tun müssen:

B) Sie benötigen weiterhin eine PrivateObject-Instanz, können jedoch mit Visual Studio "Accessor"-Objekte generieren. Gewusst wie: Regenerieren privater Zugriffsgeräte

Wenn Sie private Felder eines Objekts in Ihrem Code außerhalb von Unit-Tests festlegen, wäre dies eine Instanz von "Code-Geruch". Ich denke, der einzige andere Grund, warum Sie dies tun möchten, ist, wenn Sie es mit einem Dritten zu tun haben Bibliothek und Sie können den Zielklassencode nicht ändern. Selbst dann möchten Sie wahrscheinlich die dritte Partei kontaktieren, Ihre Situation erklären und sehen, ob sie ihren Code nicht ändern wird, um Ihren Bedürfnissen gerecht zu werden.


6 Antworten 6

Durch die Verwendung von "Kommagetrennte Datei hinzufügen" anstelle der Schaltfläche Vektorebene liest QGIS sie mit Zahlenspalten als Spalten.
Es öffnet sich ein Dialogfenster, in dem Sie das Trennzeichen in Doppelpunkt, Semikolon, Tabulator oder andere ändern können.
Wenn die CSV-Datei als Tabelle verwendet werden soll (kein xy- oder Ereignis-Layer), müssen Sie nach Keine Geometrie fragen.
Hier haben Sie ein Beispiel (sorry für die seltsame Sprache).

Ich habe es so gemacht (qgis 2.6) und alles hat reibungslos funktioniert.
Hoffe das hilft.
Asier

thx für den workaround - funktioniert!

– Robert Tuw
25. November '14 um 14:58 Uhr

das problem besteht sowohl bei 2,18 ltr als auch bei 3,4 ltr immer noch. und die Antwort ist immer noch gültig (@Asier). Verwenden Sie "Data Source Manager / Delimited Text" und legen Sie die Einstellungen entsprechend Ihrer Dateieigenschaften fest ! aber (!) auf eine saubere csv-Datei achten. Ich hatte gerade eine 2-stündige Sitzung, weil 1. eine einzelne Zeile meiner Zahlenfelder einen leeren (numerischen) Wert (d. h. NoData) enthielt 2. die csv-exportroutine hat meiner csv am ende der tabelle 2 leere felder hinzugefügt. . was zu einer csv mit Zeichenfolgenwerten anstelle von Zahlen in numerischen Feldern führt

– Robert Tuw
8. November '18 um 16:46

Speichern Sie zuerst Ihre Excel-Datei/Daten als .CSV-Datei.
Öffnen Sie QGIS und laden Sie dann Ihre Vektor-Layer-Karte, die Sie mit Ihrer .csv-Datei verbinden möchten.
Laden Sie dann Ihre .csv-Datei als Text getrennte Ebene.
Dann Kontrollkästchen des Dateiformats als (CSV) Komma getrennte Werte
dann Kontrollkästchen als Keine Geometrie (nur Attributdaten), Klicken Sie auf OK
Dadurch wird Ihre CSV-Datei hinzugefügt. Doppelklicken Sie auf die CSV-Datei, klicken Sie auf Feld und Sie können die Daten als Integers und nicht als String sehen. Das war es, was Sie wollten.

Jetzt können Sie die CSV-Datei mit Vektor-Layer-Daten verbinden, indem Sie Ihren Eingabe-Layer, Join-Layer und Ziel-Layer angeben.
Wenn Sie auf OK klicken, werden Ihre Daten verbunden und Sie können das Feld erneut überprüfen und Ihre beabsichtigten Spalten werden als Ganzzahlen angezeigt. Ich habe diese QGIS-Version 2.6 gemacht

Tatsächlich konvertiert a Schnur Feld zu Real scheint nicht mehr zu funktionieren. Ist das ein Fehler?

Sie können jedoch basierend auf einem vorhandenen Feld ein weiteres Feld erstellen. Set-Typ und Präzision (falls real) und spezifizieren das Format mit der entsprechenden Funktion (hier toreal() ). Siehe den Screenshot unten:

Mein String-Wert ist in Prüfung Feld und ich wandle es in real um in Mein echtes Feld.

gut - natürlich habe ich einige "Workarounds" gefunden. und habe es endlich geschafft einen Import durchzuführen, der funktioniert (thx für die Eingaben an alle ! ! ! - mein Fehler hatte einen führenden Return/Break in der csvt-Datei :( ). <br> aber trotzdem - das ist nicht genau so meine eingangsfrage. qgis erzeugt eine csv-ausgabe über "distance matrix" und ich würde mich sehr freuen, wenn es auch eine csvt schreiben könnte. ansonsten muss ich meinen schülern beibringen, wie man mit den oben genannten workarounds umgeht. was ok ist - aber in der Tat nicht der einfachste Weg.

– Robert Tuw
11. März '14 um 12:10

@roberttuw, vielleicht könnten Sie Ihre ursprüngliche Frage mit diesen Informationen bearbeiten und / oder eine beste Antwort als akzeptiert auswählen?

– Simbamangu
15. Februar '15 um 10:17

Wenn du ziehen und ablegen die csv-Datei in das Ebenenbedienfeld, alles funktioniert wie erwartet! (Getestet mit QGIS 2.2.0, 2.0.1, 1.8.0 und 1.7.4)

Sorins Antwort (Import als Textdatei mit Trennzeichen, ohne X/Y-Koordinaten) funktioniert in QGIS 2.8 (vielleicht auch später) gut, aber nicht in QGIS 2.16. Die numerischen Werte werden immer noch fälschlicherweise als Text behandelt. Alternative Lösungen, die ich gesehen habe (Erstellen einer CSVT-Datei oder Verwenden des Defactor-Tools) sind SEHR kompliziert und möglicherweise zeitaufwändig (zum Beispiel habe ich eine öffentliche Gesundheitstabelle mit hundert Spalten - in unterschiedlichen Abständen - werde ich mich wirklich hinsetzen? und schreibe einen CSVT-Header mit jeder korrekt beschrifteten 'text', 'int' oder was auch immer?).

Das Importieren von Tabellendaten ist ein grundlegender Vorgang und muss so einfach wie möglich sein, um die Benutzerfreundlichkeit und Attraktivität von QGIS für Nicht-Entwickler zu erhalten, die einfach so viel Zeit wie möglich mit den tatsächlichen Daten verbringen möchten, und nicht mit Umgehungslösungen diese Daten.

Kann ich mich also bitte an die QGIS-Entwicklungsgemeinschaft wenden, um der Vereinfachung dieser Operation Priorität einzuräumen?

Ich weiß nicht, wie man ein Ticket ausstellt, also würde ich mich über Hilfe freuen, wenn dies erforderlich ist.

richtig - es funktioniert immer noch nicht richtig in 2.18 und in 3.4 (!) . Wenn Sie Excel auf Ihrem Computer haben, können Sie die CSV-Datei mit Excel öffnen und als xls oder xlsx speichern. Wenn es keine Typ-Mismatches gibt (wie txt, NoData oder Leerzeichen in numerischen Feldern, leeren Feldern oder Zeilen), erhalten Sie ein xls(x), das als Eingabe in 2.18 und 3.4 dient. und wenn Sie wirklich eine csv + csvt benötigen, können Sie diese Tabelle mit qgis export exportieren und eine gültige csvt erstellen, indem Sie die entsprechende Exportoption setzen)

– Robert Tuw
9. November '18 um 7:43

Das richtige Format für die csv-Datei ist das Trennzeichen mit , als Trennzeichen der csvt-Datei. Das scheint an deinem Beispiel nicht richtig zu sein.


BOOL und BOOLEAN sind Synonyme von TINYINT in MySQL. Siehe MySQL-Dokumente: Übersicht über numerische Typen

Sie möchten wahrscheinlich den BIT-Datentyp verwenden.

MySQL unterstützt keine echten booleschen Werte gemäß Standard-SQL. Es verwendet ganzzahlige Werte 1 bzw. 0 für wahr und falsch. Es unterstützt die Schlüsselwörter true und false , aber diese werden den ganzzahligen Werten zugeordnet.

Sie sind wirklich ganzen Zahlen zugeordnet:

Dies bedeutet jedoch, dass bestimmte Ausdrücke in MySQL einfacher sind, z. B. das Zählen der Zeilen, bei denen ein bestimmter Wert wahr ist, ist so einfach wie SUM() eines booleschen Ausdrucks, der 1 ist, wenn die Bedingung wahr ist, und ansonsten 0.

Standard-SQL unterstützt diese Verwendung von booleschen Werten als Ganzzahlen nicht und erfordert die ausführlichere:

Wie bereits in anderen Antworten erwähnt, können Sie einen Datentypalias BOOL verwenden, der jedoch sofort durch TINYINT(1) ersetzt wird (MySQL macht etwas Ähnliches mit anderen Datentypen wie REAL und SERIAL ).


Wie kann ich in QGIS den Feldtyp einer Attributtabelle von String in Double ändern? - Geografisches Informationssystem

Dieses Kapitel bietet eine Einführung in Schemaobjekte und erörtert Tabellen, die die gebräuchlichsten Typen von Schemaobjekten sind.

Dieses Kapitel enthält die folgenden Abschnitte:

Einführung in Schemaobjekte

Ein Datenbankschema ist ein logischer Container für Datenstrukturen, die als Schemaobjekte bezeichnet werden. Beispiele für Schemaobjekte sind Tabellen und Indizes. Sie erstellen und bearbeiten Schemaobjekte mit SQL.

Ein Datenbankbenutzerkonto verfügt über ein Kennwort und bestimmte Datenbankberechtigungen. Jedes Benutzerkonto besitzt ein einzelnes Schema, das denselben Namen wie der Benutzer hat. Das Schema enthält die Daten für den Benutzer, der das Schema besitzt. Beispielsweise besitzt das hr-Benutzerkonto das hr-Schema, das Schemaobjekte wie die Tabelle der Mitarbeiter enthält. In einer Produktionsdatenbank repräsentiert der Schemabesitzer normalerweise eine Datenbankanwendung und keine Person.

Innerhalb eines Schemas hat jedes Schemaobjekt eines bestimmten Typs einen eindeutigen Namen. Beispielsweise bezieht sich hr.employees auf die Tabelle mitarbeiter im hr-Schema. Abbildung 2-1 zeigt einen Schemabesitzer namens hr und Schemaobjekte innerhalb des hr-Schemas.

Dieser Abschnitt enthält die folgenden Themen:

"Überblick über die Datenbanksicherheit", um mehr über Benutzer und Berechtigungen zu erfahren

Schemaobjekttypen

Mit Oracle SQL können Sie viele andere Arten von Schemaobjekten erstellen und bearbeiten.

Die Haupttypen von Schemaobjekten sind in der folgenden Tabelle aufgeführt.

Eine Tabelle speichert Daten in Zeilen. Tabellen sind die wichtigsten Schemaobjekte in einer relationalen Datenbank.

Indizes sind Schemaobjekte, die für jede indizierte Zeile der Tabelle oder des Tabellenclusters einen Eintrag enthalten und einen direkten, schnellen Zugriff auf Zeilen ermöglichen. Oracle Database unterstützt verschiedene Indextypen. Eine indexorganisierte Tabelle ist eine Tabelle, in der die Daten in einer Indexstruktur gespeichert sind.

Partitionen sind Teile großer Tabellen und Indizes. Jede Partition hat ihren eigenen Namen und kann optional ihre eigenen Speichereigenschaften haben.

Ansichten sind benutzerdefinierte Darstellungen von Daten in einer oder mehreren Tabellen oder anderen Ansichten. Sie können sich diese als gespeicherte Abfragen vorstellen. Ansichten enthalten keine Daten.

Eine Sequenz ist ein vom Benutzer erstelltes Objekt, das von mehreren Benutzern gemeinsam genutzt werden kann, um Ganzzahlen zu generieren. Normalerweise verwenden Sie Sequenzen, um Primärschlüsselwerte zu generieren.

Eine Dimension definiert eine Eltern-Kind-Beziehung zwischen Paaren von Spaltensätzen, wobei alle Spalten eines Spaltensatzes aus derselben Tabelle stammen müssen. Dimensionen werden häufig verwendet, um Daten wie Kunden, Produkte und Zeit zu kategorisieren.

Ein Synonym ist ein Alias ​​für ein anderes Schemaobjekt. Da ein Synonym einfach ein Alias ​​ist, benötigt es außer seiner Definition im Datenwörterbuch keine weitere Speicherung.

PL/SQL-Unterprogramme und -Pakete

PL/SQL ist die prozedurale Oracle-Erweiterung von SQL. Ein PL/SQL-Unterprogramm ist ein benannter PL/SQL-Block, der mit einer Reihe von Parametern aufgerufen werden kann. Ein PL/SQL-Paket gruppiert logisch verwandte PL/SQL-Typen, -Variablen und -Unterprogramme.

Andere Arten von Objekten werden ebenfalls in der Datenbank gespeichert und können mit SQL-Anweisungen erstellt und bearbeitet werden, sind jedoch nicht in einem Schema enthalten. Zu diesen Objekten gehören Datenbankbenutzerkonten, Rollen, Kontexte und Wörterbuchobjekte.

Oracle Database Administrator’s Guide zum Verwalten von Schemaobjekten

Oracle Database SQL Language Reference für weitere Informationen zu Schemaobjekten und Datenbankobjekten

Schemaobjektspeicher

Einige Schemaobjekte speichern Daten in einer Art logischer Speicherstruktur, die als Segment bezeichnet wird. Beispielsweise erstellt eine nicht partitionierte Heap-organisierte Tabelle oder ein Index ein Segment.

Andere Schemaobjekte wie Ansichten und Sequenzen bestehen nur aus Metadaten. In diesem Thema werden nur Schemaobjekte beschrieben, die Segmente haben.

Oracle Database speichert ein Schemaobjekt logisch in einem Tablespace. Es besteht keine Beziehung zwischen Schemas und Tablespaces: Ein Tablespace kann Objekte aus verschiedenen Schemas enthalten, und die Objekte für ein Schema können in verschiedenen Tablespaces enthalten sein. Die Daten jedes Objekts sind physisch in einer oder mehreren Datendateien enthalten.

Die folgende Abbildung zeigt eine mögliche Konfiguration von Tabellen- und Indexsegmenten, Tablespaces und Datendateien. Das Datensegment für eine Tabelle umfasst zwei Datendateien, die beide Teil desselben Tabellenbereichs sind. Ein Segment kann sich nicht über mehrere Tablespaces erstrecken.

Abbildung 2-2 Segmente, Tablespaces und Datendateien

"Logische Speicherstrukturen", um mehr über Tablespaces und Segmente zu erfahren

Oracle Database Administrator’s Guide, um zu erfahren, wie Sie den Speicher für Schemaobjekte verwalten

Abhängigkeiten von Schemaobjekten

Einige Schemaobjekte verweisen auf andere Objekte, wodurch eine Schemaobjektabhängigkeit entsteht.

Eine Ansicht enthält beispielsweise eine Abfrage, die auf Tabellen oder Ansichten verweist, während ein PL/SQL-Unterprogramm andere Unterprogramme aufruft. Wenn die Definition von Objekt A auf Objekt B verweist, dann ist A ein abhängiges Objekt von B und B ist ein referenziertes Objekt von A.

Oracle Database bietet einen automatischen Mechanismus, um sicherzustellen, dass ein abhängiges Objekt in Bezug auf seine referenzierten Objekte immer auf dem neuesten Stand ist. Wenn Sie ein abhängiges Objekt erstellen, verfolgt die Datenbank Abhängigkeiten zwischen dem abhängigen Objekt und seinen referenzierten Objekten. Wenn sich ein referenziertes Objekt in einer Weise ändert, die sich auf ein abhängiges Objekt auswirken könnte, markiert die Datenbank das abhängige Objekt als ungültig. Wenn ein Benutzer beispielsweise eine Tabelle löscht, kann keine auf der gelöschten Tabelle basierende Ansicht verwendet werden.

Ein ungültiges abhängiges Objekt muss gegen die neue Definition eines referenzierten Objekts neu kompiliert werden, bevor das abhängige Objekt verwendet werden kann. Die Neukompilierung erfolgt automatisch, wenn auf das ungültige abhängige Objekt verwiesen wird.

Zur Veranschaulichung, wie Schemaobjekte Abhängigkeiten erstellen können, erstellt das folgende Beispielskript eine Tabelle test_table und dann eine Prozedur, die diese Tabelle abfragt:

Die folgende Abfrage des Status der Prozedur test_proc zeigt, dass diese gültig ist:

Nach dem Hinzufügen der Spalte col3 zu test_table ist die Prozedur weiterhin gültig, da die Prozedur keine Abhängigkeiten von dieser Spalte hat:

Wenn Sie jedoch den Datentyp der Spalte col1 ändern, von dem die Prozedur test_proc abhängt, wird die Prozedur ungültig:

Durch Ausführen oder erneutes Kompilieren der Prozedur wird sie wieder gültig, wie im folgenden Beispiel gezeigt:

SYS- und SYSTEM-Schemas

Alle Oracle-Datenbanken enthalten standardmäßige Administratorkonten.

Administratorkonten haben hohe Privilegien und sind nur für DBAs gedacht, die berechtigt sind, Aufgaben wie das Starten und Stoppen der Datenbank, das Verwalten von Arbeitsspeicher und Speicher, das Erstellen und Verwalten von Datenbankbenutzern usw. auszuführen.

Das Administratorkonto SYS wird automatisch erstellt, wenn eine Datenbank erstellt wird. Dieses Konto kann alle Datenbankverwaltungsfunktionen ausführen. Das SYS-Schema speichert die Basistabellen und Sichten für das Data Dictionary. Diese Basistabellen und Sichten sind für den Betrieb von Oracle Database von entscheidender Bedeutung.Tabellen im Schema SYS werden nur von der Datenbank manipuliert und dürfen von keinem Benutzer geändert werden.

Das Administratorkonto SYSTEM wird auch automatisch erstellt, wenn eine Datenbank erstellt wird. Das SYSTEM-Schema speichert zusätzliche Tabellen und Ansichten, die Verwaltungsinformationen anzeigen, sowie interne Tabellen und Ansichten, die von verschiedenen Oracle Database-Optionen und -Tools verwendet werden. Verwenden Sie niemals das SYSTEM-Schema, um Tabellen zu speichern, die für Benutzer ohne Administratorrechte von Interesse sind.

Oracle Database Administrator’s Guide, um mehr über SYS , SYSTEM und andere Administratorkonten zu erfahren

Beispielschemata

Eine Oracle-Datenbank kann Folgendes enthalten: Beispielschemata, bei denen es sich um einen Satz miteinander verbundener Schemata handelt, die es der Oracle-Dokumentation und den Oracle-Anleitungsmaterialien ermöglichen, allgemeine Datenbankaufgaben zu veranschaulichen.

Das hr-Beispielschema enthält Informationen zu Mitarbeitern, Abteilungen und Standorten, Arbeitshistorien usw. Die folgende Abbildung zeigt ein Entity-Relationship-Diagramm der Tabellen in hr . Die meisten Beispiele in diesem Handbuch verwenden Objekte aus diesem Schema.

Oracle Database Sample Schemas, um zu erfahren, wie Sie die Beispielschemas installieren

Übersicht der Tabellen

Eine Tabelle ist die grundlegende Einheit der Datenorganisation in einer Oracle-Datenbank.

Eine Tabelle beschreibt eine Entität, die von Bedeutung ist und über die Informationen aufgezeichnet werden müssen. Ein Mitarbeiter kann beispielsweise eine Entität sein.

Oracle Database-Tabellen fallen in die folgenden grundlegenden Kategorien:

Relationale Tabellen haben einfache Spalten und sind der gebräuchlichste Tabellentyp. Beispiel 2-1 zeigt eine CREATE TABLE-Anweisung für eine relationale Tabelle.

Die Spalten entsprechen den Attributen der obersten Ebene eines Objekttyps. Siehe "Übersicht über Objekttabellen" .

Sie können eine relationale Tabelle mit den folgenden organisatorischen Merkmalen erstellen:

Eine im Heap organisierte Tabelle speichert Zeilen nicht in einer bestimmten Reihenfolge. Die CREATE TABLE-Anweisung erstellt standardmäßig eine im Heap organisierte Tabelle.

Eine indexorganisierte Tabelle ordnet Zeilen nach den Primärschlüsselwerten. Bei einigen Anwendungen verbessern indexorganisierte Tabellen die Leistung und nutzen den Speicherplatz effizienter. Siehe "Übersicht über indexorganisierte Tabellen" .

Eine externe Tabelle ist eine schreibgeschützte Tabelle, deren Metadaten in der Datenbank gespeichert sind, deren Daten jedoch außerhalb der Datenbank gespeichert werden. Siehe "Übersicht externer Tabellen" .

Eine Tabelle ist entweder permanent oder temporär. Eine permanente Tabellendefinition und Daten bleiben sitzungsübergreifend erhalten. Eine temporäre Tabellendefinition bleibt genauso erhalten wie eine permanente Tabellendefinition, aber die Daten existieren nur für die Dauer einer Transaktion oder Sitzung . Temporäre Tabellen sind in Anwendungen nützlich, in denen eine Ergebnismenge vorübergehend gehalten werden muss, möglicherweise weil das Ergebnis durch Ausführen mehrerer Operationen erstellt wird.

Dieses Thema enthält die folgenden Themen:

Säulen

Eine Tabellendefinition enthält einen Tabellennamen und einen Satz von Spalten.

Eine Spalte identifiziert ein Attribut der von der Tabelle beschriebenen Entität. Beispielsweise bezieht sich die Spalte employee_id in der Employees-Tabelle auf das Mitarbeiter-ID-Attribut einer Mitarbeiterentität.

Im Allgemeinen geben Sie beim Erstellen einer Tabelle jeder Spalte einen Spaltennamen, einen Datentyp und eine Breite. Der Datentyp für employee_id ist beispielsweise NUMBER(6) , was angibt, dass diese Spalte nur numerische Daten mit einer Breite von bis zu 6 Stellen enthalten kann. Die Breite kann wie bei DATE durch den Datentyp vorgegeben werden.

Virtuelle Spalten

Eine Tabelle kann a . enthalten virtuelle Spalte, die im Gegensatz zu einer nicht virtuellen Spalte keinen Speicherplatz belegt.

Die Datenbank leitet die Werte in einer virtuellen Spalte bei Bedarf ab, indem sie einen Satz benutzerdefinierter Ausdrücke oder Funktionen berechnet. Beispielsweise könnte die virtuelle Spalte Einkommen eine Funktion der Spalten Gehalt und Provision_pct sein.

Oracle Database Administrator’s Guide zum Verwalten virtueller Spalten

Unsichtbare Spalten

Eine unsichtbare Spalte ist eine benutzerdefinierte Spalte, deren Werte nur sichtbar sind, wenn die Spalte explizit durch den Namen angegeben wird. Sie können einer Tabelle eine unsichtbare Spalte hinzufügen, ohne vorhandene Anwendungen zu beeinträchtigen, und die Spalte bei Bedarf sichtbar machen.

Im Allgemeinen helfen unsichtbare Spalten bei der Migration und Weiterentwicklung von Onlineanwendungen. Ein Anwendungsfall könnte eine Anwendung sein, die eine dreispaltige Tabelle mit einer SELECT *-Anweisung abfragt. Das Hinzufügen einer vierten Spalte zur Tabelle würde die Anwendung unterbrechen, die drei Datenspalten erwartet. Durch das Hinzufügen einer vierten unsichtbaren Spalte funktioniert die Anwendung normal. Ein Entwickler kann dann die Anwendung ändern, um eine vierte Spalte zu verarbeiten, und die Spalte sichtbar machen, wenn die Anwendung live geht.

Das folgende Beispiel erstellt eine Tabelle products mit einer unsichtbaren Spaltenanzahl und macht dann die unsichtbare Spalte sichtbar:

Oracle Database Administrator’s Guide zum Verwalten unsichtbarer Spalten

Oracle Database SQL Language Reference für weitere Informationen zu unsichtbaren Spalten

Eine Zeile ist eine Sammlung von Spalteninformationen, die einem Datensatz in einer Tabelle entsprechen.

Eine Zeile in der Tabelle "Mitarbeiter" beschreibt beispielsweise die Attribute eines bestimmten Mitarbeiters: Mitarbeiter-ID, Nachname, Vorname usw. Nachdem Sie eine Tabelle erstellt haben, können Sie Zeilen mithilfe von SQL einfügen, abfragen, löschen und aktualisieren.

Beispiel: CREATE TABLE- und ALTER TABLE-Anweisungen

Die Oracle SQL-Anweisung zum Erstellen einer Tabelle lautet CREATE TABLE .

Beispiel 2-1 CREATE TABLE-Mitarbeiter

Das folgende Beispiel zeigt die CREATE TABLE-Anweisung für die Employees-Tabelle im hr-Beispielschema. Die Anweisung gibt Spalten wie mitarbeiter_id , vorname usw. an und gibt für jede Spalte einen Datentyp wie NUMBER oder DATE an.

Beispiel 2-2 ALTER TABLE-Mitarbeiter

Das folgende Beispiel zeigt eine ALTER TABLE-Anweisung, die Integritätseinschränkungen zur Employees-Tabelle hinzufügt. Integritätsbeschränkungen erzwingen Geschäftsregeln und verhindern die Eingabe ungültiger Informationen in Tabellen.

Beispiel 2-3 Zeilen in der Mitarbeitertabelle

Die folgende Beispielausgabe zeigt 8 Zeilen und 6 Spalten der Tabelle hr.employees.

Die obige Ausgabe veranschaulicht einige der folgenden wichtigen Merkmale von Tabellen, Spalten und Zeilen:

Eine Zeile der Tabelle beschreibt die Attribute eines Mitarbeiters: Name, Gehalt, Abteilung usw. Die erste Zeile der Ausgabe zeigt beispielsweise den Datensatz für den Mitarbeiter namens Steven King.

Eine Spalte beschreibt ein Attribut des Mitarbeiters. Im Beispiel ist die Spalte employee_id der Primärschlüssel , was bedeutet, dass jeder Mitarbeiter durch die Mitarbeiter-ID eindeutig identifiziert wird. Je zwei Mitarbeiter haben garantiert nicht die gleiche Mitarbeiter-ID.

Eine Nicht-Schlüsselspalte kann Zeilen mit identischen Werten enthalten. Im Beispiel ist der Gehaltswert für die Mitarbeiter 101 und 102 gleich: 17000 .

Eine Fremdschlüsselspalte bezieht sich auf einen primären oder eindeutigen Schlüssel in derselben Tabelle oder einer anderen Tabelle. In diesem Beispiel entspricht der Wert von 90 in Abteilung_ID der Spalte Abteilung_ID der Tabelle Abteilungen.

Ein Feld ist der Schnittpunkt einer Zeile und einer Spalte. Es kann nur einen Wert enthalten. Beispielsweise enthält das Feld für die Abteilungs-ID des Mitarbeiters 103 den Wert 60 .

Einem Feld kann ein Wert fehlen. In diesem Fall soll das Feld einen Nullwert enthalten. Der Wert der Spalte provisions_pct für Mitarbeiter 100 ist null, während der Wert im Feld für Mitarbeiter 149 0,2 beträgt. Eine Spalte lässt NULL-Werte zu, es sei denn, für diese Spalte wurde eine NOT NULL- oder Primärschlüssel-Integritätseinschränkung definiert. In diesem Fall kann keine Zeile ohne einen Wert für diese Spalte eingefügt werden.

Oracle Database SQL-Sprachreferenz für CREATE TABLE-Syntax und -Semantik

Oracle-Datentypen

Jede Spalte hat einen Datentyp , der einem bestimmten Speicherformat, Einschränkungen und einem gültigen Wertebereich zugeordnet ist. Der Datentyp eines Werts ordnet dem Wert einen festen Satz von Eigenschaften zu.

Diese Eigenschaften bewirken, dass Oracle Database Werte eines Datentyps anders behandelt als Werte eines anderen. Sie können beispielsweise Werte des Datentyps NUMBER multiplizieren, jedoch keine Werte des Datentyps RAW.

Wenn Sie eine Tabelle erstellen, müssen Sie für jede ihrer Spalten einen Datentyp angeben. Jeder nachfolgend in eine Spalte eingefügte Wert nimmt den Spaltendatentyp an.

Oracle Database bietet mehrere integrierte Datentypen. Die am häufigsten verwendeten Datentypen fallen in die folgenden Kategorien:

Andere wichtige Kategorien von integrierten Typen umfassen Rohdaten, große Objekte (LOBs) und Sammlungen. PL/SQL hat Datentypen für Konstanten und Variablen, darunter BOOLEAN , Referenztypen, zusammengesetzte Typen (Datensätze) und benutzerdefinierte Typen.

Oracle Database SQL Language Reference, um mehr über integrierte SQL-Datentypen zu erfahren

Oracle Database Development Guide, um zu erfahren, wie Sie die integrierten Datentypen verwenden

Zeichendatentypen

Zeichendatentypen speichern alphanumerische Daten in Zeichenfolgen. Der gebräuchlichste Zeichendatentyp ist VARCHAR2 , die effizienteste Option zum Speichern von Zeichendaten.

Die Bytewerte entsprechen dem Zeichencodierungsschema, das allgemein als Zeichensatz bezeichnet wird. Der Datenbankzeichensatz wird bei der Datenbankerstellung eingerichtet. Beispiele für Zeichensätze sind 7-Bit-ASCII, EBCDIC und Unicode UTF-8.

Die Längensemantik von Zeichendatentypen ist in Bytes oder Zeichen messbar. Die Behandlung von Strings als Folge von Bytes wird als Byte-Semantik bezeichnet. Dies ist die Standardeinstellung für Zeichendatentypen. Die Behandlung von Strings als Folge von Zeichen wird als Zeichensemantik bezeichnet. Ein Zeichen ist ein Codepunkt des Datenbankzeichensatzes.

Oracle Database 2 Day Developer's Guide für eine kurze Einführung in Datentypen

Oracle Database Development Guide, um zu erfahren, wie Sie einen Zeichendatentyp auswählen

VARCHAR2- und CHAR-Datentypen

Zum Beispiel 'LILA' , 'St. George Island' und '101' sind alle Zeichenliterale 5001 ist ein numerisches Literal. Zeichenliterale werden in einfache Anführungszeichen eingeschlossen, damit die Datenbank sie von Schemaobjektnamen unterscheiden kann.

In diesem Handbuch werden die Begriffe Textliteral , Zeichenliteral und String synonym verwendet.

Wenn Sie eine Tabelle mit einer VARCHAR2-Spalte erstellen, geben Sie eine maximale Zeichenfolgenlänge an. In Beispiel 2-1 hat die Spalte last_name den Datentyp VARCHAR2(25) , was bedeutet, dass jeder in der Spalte gespeicherte Name maximal 25 Byte lang ist.

Für jede Zeile speichert Oracle Database jeden Wert in der Spalte als Feld mit variabler Länge, es sei denn, ein Wert überschreitet die maximale Länge. In diesem Fall gibt die Datenbank einen Fehler zurück. Wenn Sie beispielsweise in einem Einzelbyte-Zeichensatz 10 Zeichen für den Spaltenwert nachname in einer Zeile eingeben, speichert die Spalte im Zeilenteil nur 10 Zeichen (10 Byte) und nicht 25. Die Verwendung von VARCHAR2 reduziert den Speicherplatzverbrauch.

Im Gegensatz zu VARCHAR2 speichert CHAR Zeichenfolgen fester Länge. Wenn Sie eine Tabelle mit einer CHAR-Spalte erstellen, erfordert die Spalte eine Zeichenfolgenlänge. Der Standardwert ist 1 Byte. Die Datenbank verwendet Leerzeichen, um den Wert auf die angegebene Länge aufzufüllen.

Oracle Database vergleicht VARCHAR2-Werte unter Verwendung einer nicht aufgefüllten Vergleichssemantik und vergleicht CHAR-Werte unter Verwendung einer mit Leerzeichen aufgefüllten Vergleichssemantik.

Oracle Database SQL Language Reference für Details zur Vergleichssemantik mit und ohne Leerzeichen

NCHAR- und NVARCHAR2-Datentypen

Unicode ist ein universeller codierter Zeichensatz, der Informationen in jeder Sprache mit einem einzigen Zeichensatz speichern kann. NCHAR speichert Zeichenfolgen fester Länge, die dem nationalen Zeichensatz entsprechen, während NVARCHAR2 Zeichenfolgen variabler Länge speichert.

Beim Erstellen einer Datenbank geben Sie einen nationalen Zeichensatz an. Der Zeichensatz der Datentypen NCHAR und NVARCHAR2 muss entweder AL16UTF16 oder UTF8 sein. Beide Zeichensätze verwenden die Unicode-Codierung.

Wenn Sie eine Tabelle mit einer NCHAR- oder NVARCHAR2-Spalte erstellen, wird die maximale Größe immer in der Zeichenlängensemantik angegeben. Die Zeichenlängensemantik ist die standardmäßige und einzige Längensemantik für NCHAR oder NVARCHAR2 .

Oracle Database Globalization Support Guide für Informationen über die Globalisierungsunterstützungsfunktion von Oracle

Numerische Datentypen

Die numerischen Datentypen von Oracle Database speichern Fest- und Gleitkommazahlen, Null und Unendlich. Einige numerische Typen speichern auch Werte, die das undefinierte Ergebnis einer Operation sind, die als "keine Zahl" oder NaN bekannt ist.

Oracle Database speichert numerische Daten im Format variabler Länge. Jeder Wert wird in wissenschaftlicher Notation gespeichert, wobei 1 Byte zum Speichern des Exponenten verwendet wird. Die Datenbank verwendet bis zu 20 Byte, um die Mantisse zu speichern, die den Teil einer Gleitkommazahl ist, der ihre signifikanten Ziffern enthält. Oracle Database speichert keine führenden und nachgestellten Nullen.

NUMBER Datentyp

Der Datentyp NUMBER speichert Fest- und Gleitkommazahlen. Die Datenbank kann Zahlen praktisch jeder Größenordnung speichern. Diese Daten sind garantiert zwischen verschiedenen Betriebssystemen portierbar, auf denen Oracle Database ausgeführt wird. Der Datentyp NUMBER wird für die meisten Fälle empfohlen, in denen Sie numerische Daten speichern müssen.

Sie geben eine Festkommazahl in der Form ANZAHL ( p , s ) an, wobei sich p und s auf folgende Merkmale beziehen:

Die Genauigkeit gibt die Gesamtzahl der Stellen an. Wenn keine Genauigkeit angegeben ist, speichert die Spalte die Werte genau so, wie sie von der Anwendung bereitgestellt werden, ohne dass Rundung erfolgt.

Die Skala gibt die Anzahl der Stellen vom Komma bis zur niedrigstwertigen Stelle an. Eine positive Skala zählt die Ziffern rechts vom Dezimalpunkt bis einschließlich der niedrigstwertigen Ziffer. Die negative Skala zählt die Ziffern links vom Dezimalpunkt bis zur niederwertigsten Ziffer, jedoch nicht einschließlich. Wenn Sie eine Genauigkeit ohne Skala angeben, wie in NUMBER(6) , ist die Skala 0.

In Beispiel 2-1 hat die Gehaltsspalte den Typ NUMBER(8,2) , die Genauigkeit ist also 8 und die Skala ist 2. Somit speichert die Datenbank ein Gehalt von 100.000 als 100000.00 .

Gleitkommazahlen

Oracle Database bietet zwei numerische Datentypen ausschließlich für Gleitkommazahlen: BINARY_FLOAT und BINARY_DOUBLE .

Diese Typen unterstützen alle grundlegenden Funktionen, die vom Datentyp NUMBER bereitgestellt werden. Während NUMBER jedoch dezimale Genauigkeit verwendet, verwenden BINARY_FLOAT und BINARY_DOUBLE binäre Genauigkeit, was schnellere arithmetische Berechnungen ermöglicht und normalerweise den Speicherbedarf reduziert.

BINARY_FLOAT und BINARY_DOUBLE sind ungefähre numerische Datentypen. Sie speichern ungefähre Darstellungen von Dezimalwerten anstelle von exakten Darstellungen. Beispielsweise kann der Wert 0.1 weder durch BINARY_DOUBLE noch durch BINARY_FLOAT exakt dargestellt werden. Sie werden häufig für wissenschaftliche Berechnungen verwendet. Ihr Verhalten ähnelt den Datentypen FLOAT und DOUBLE in Java und XMLSchema.

Oracle Database SQL Language Reference, um mehr über Genauigkeit, Skalierung und andere Merkmale numerischer Typen zu erfahren

Datetime-Datentypen

Die datetime-Datentypen sind DATE und TIMESTAMP . Oracle Database bietet umfassende Zeitzonenunterstützung für Zeitstempel.

DATE Datentyp

Der Datentyp DATE speichert Datum und Uhrzeit. Obwohl datetimes in Zeichen- oder Zahlendatentypen dargestellt werden können, hat DATE spezielle zugehörige Eigenschaften.

Die Datenbank speichert Daten intern als Zahlen. Datumsangaben werden in Feldern mit fester Länge von jeweils 7 Byte gespeichert, die Jahrhundert, Jahr, Monat, Tag, Stunde, Minute und Sekunde entsprechen.

Datumsangaben unterstützen vollständig arithmetische Operationen, sodass Sie Datumsangaben genau wie bei Zahlen addieren und subtrahieren können.

Die Datenbank zeigt Datumsangaben gemäß dem angegebenen Formatmodell an. Ein Formatmodell ist ein Zeichenliteral, das das Format einer Datums-/Uhrzeit in einer Zeichenfolge beschreibt. Das Standard-Datumsformat ist DD-MON-RR , das Datumsangaben in der Form 01-JAN-11 anzeigt.

RR ähnelt YY (die letzten beiden Ziffern des Jahres), aber das Jahrhundert des Rückgabewerts variiert entsprechend dem angegebenen zweistelligen Jahr und den letzten beiden Ziffern des aktuellen Jahres. Angenommen, die Datenbank zeigt im Jahr 1999 01-JAN-11 an. Wenn das Datumsformat RR verwendet, gibt 11 das Jahr 2011 an, während das Format YY angibt, dann gibt 11 1911 an. Sie können das Standarddatumsformat sowohl auf Datenbankinstanz- als auch auf Sitzungsebene ändern.

Oracle Database speichert die Zeit im 24-Stunden-Format – HH:MI:SS . Wenn kein Zeitabschnitt eingegeben wird, ist die Zeit in einem Datumsfeld standardmäßig 00:00:00 A.M . Bei einem reinen Zeiteintrag wird der Datumsteil standardmäßig auf den ersten Tag des aktuellen Monats gesetzt.

Oracle Database Development Guide für weitere Informationen zu Jahrhunderten und Datumsformatmasken

Oracle Database SQL Language Reference für Informationen zu Datetime-Formatcodes

Oracle Database Development Guide, um zu erfahren, wie man arithmetische Operationen mit datetime-Datentypen durchführt

TIMESTAMP-Datentyp

Der Datentyp TIMESTAMP ist eine Erweiterung des Datentyps DATE.

TIMESTAMP speichert zusätzlich zu den im Datentyp DATE gespeicherten Informationen Sekundenbruchteile. Der Datentyp TIMESTAMP ist zum Speichern präziser Zeitwerte nützlich, beispielsweise in Anwendungen, die die Ereignisreihenfolge verfolgen müssen.

Die DATETIME-Datentypen TIMESTAMP WITH TIME ZONE und TIMESTAMP WITH LOCAL TIME ZONE sind zeitzonenabhängig. Wenn ein Benutzer die Daten auswählt, wird der Wert an die Zeitzone der Benutzersitzung angepasst. Dieser Datentyp ist nützlich, um Datumsinformationen über geografische Regionen hinweg zu sammeln und auszuwerten.

Oracle Database SQL Language Reference für Details zur Syntax zum Erstellen und Eingeben von Daten in Zeitstempelspalten

Rowid-Datentypen

Jede in der Datenbank gespeicherte Zeile hat eine Adresse. Oracle Database verwendet einen ROWID-Datentyp, um die Adresse (rowid) jeder Zeile in der Datenbank zu speichern.

Rowids fallen in die folgenden Kategorien:

Physische Rowids speichern die Adressen von Zeilen in Heap-organisierten Tabellen, Tabellenclustern und Tabellen- und Indexpartitionen.

Logische Zeilen-IDs speichern die Adressen von Zeilen in indexorganisierten Tabellen.

Fremdzeilen-IDs sind Bezeichner in Fremdtabellen, z. B. DB2-Tabellen, auf die über ein Gateway zugegriffen wird. Es handelt sich nicht um standardmäßige Oracle Database Rowids.

Ein Datentyp namens universelle Rowid oder urowid unterstützt alle Typen von Rowids.

Einsatz von Rowids

Ein B-Baum-Index, der am häufigsten vorkommende Typ, enthält eine geordnete Liste von Schlüsseln, die in Bereiche unterteilt sind. Jeder Schlüssel ist mit einer Zeilen-ID verknüpft, die für einen schnellen Zugriff auf die Adresse der zugeordneten Zeile zeigt.

Endbenutzer und Anwendungsentwickler können Rowids auch für mehrere wichtige Funktionen verwenden:

Rowids sind das schnellste Mittel, um auf bestimmte Zeilen zuzugreifen.

Rowids bieten die Möglichkeit zu sehen, wie eine Tabelle organisiert ist.

Rowids sind eindeutige Bezeichner für Zeilen in einer bestimmten Tabelle.

Sie können auch Tabellen mit Spalten erstellen, die mit dem Datentyp ROWID definiert sind. Sie können beispielsweise eine Ausnahmetabelle mit einer Spalte vom Datentyp ROWID definieren, um die Zeilen-IDs von Zeilen zu speichern, die Integritätsbedingungen verletzen. Mit dem Datentyp ROWID definierte Spalten verhalten sich wie andere Tabellenspalten: Werte können aktualisiert werden usw.

ROWID Pseudospalte

Jede Tabelle in einer Oracle-Datenbank hat eine Pseudospalte namens ROWID .

Eine Pseudospalte verhält sich wie eine Tabellenspalte, wird aber nicht wirklich in der Tabelle gespeichert. Sie können aus Pseudospalten auswählen, aber Sie können deren Werte nicht einfügen, aktualisieren oder löschen. Eine Pseudospalte ähnelt auch einer SQL-Funktion ohne Argumente. Funktionen ohne Argumente geben normalerweise für jede Zeile in der Ergebnismenge denselben Wert zurück, während Pseudospalten normalerweise für jede Zeile einen anderen Wert zurückgeben.

Werte der Pseudospalte ROWID sind Zeichenfolgen, die die Adresse jeder Zeile darstellen.Diese Strings haben den Datentyp ROWID . Diese Pseudospalte ist nicht offensichtlich, wenn die Struktur einer Tabelle durch Ausführen von SELECT oder DESCRIBE aufgelistet wird, noch verbraucht die Pseudospalte Speicherplatz. Die Zeilen-ID jeder Zeile kann jedoch mit einer SQL-Abfrage unter Verwendung des reservierten Wortes ROWID als Spaltenname abgerufen werden.

Im folgenden Beispiel wird die Pseudospalte ROWID abgefragt, um die Rowid der Zeile in der Employees-Tabelle für Employee 100 anzuzeigen:

Oracle Database Development Guide, um zu erfahren, wie Sie Zeilen anhand der Adresse identifizieren

Formatmodelle und Datentypen

Ein Formatmodell ist ein Zeichenliteral, das das Format von Datum/Uhrzeit- oder numerischen Daten beschreibt, die in einer Zeichenfolge gespeichert sind. Ein Formatmodell ändert die interne Darstellung des Werts in der Datenbank nicht.

Wenn Sie eine Zeichenfolge in ein Datum oder eine Zahl konvertieren, bestimmt ein Formatmodell, wie die Datenbank die Zeichenfolge interpretiert. In SQL können Sie ein Formatmodell als Argument der Funktionen TO_CHAR und TO_DATE verwenden, um einen von der Datenbank zurückzugebenden Wert oder einen in der Datenbank zu speichernden Wert zu formatieren.

Die folgende Anweisung wählt die Gehälter der Mitarbeiter in Abteilung 80 aus und verwendet die Funktion TO_CHAR, um diese Gehälter in Zeichenwerte mit dem durch das Zahlenformatmodell '99.990,99 $' angegebenen Format umzuwandeln:

Das folgende Beispiel aktualisiert ein Einstellungsdatum mit der Funktion TO_DATE mit der Formatmaske 'YYYY MM DD', um die Zeichenfolge '1998 05 20' in einen DATE-Wert umzuwandeln:

Integritätsbedingungen

Ein Integritätsbeschränkung ist eine benannte Regel, die die Werte für eine oder mehrere Spalten in einer Tabelle einschränkt.

Datenintegritätsregeln verhindern ungültige Dateneingaben in Tabellen. Außerdem können Einschränkungen das Löschen einer Tabelle verhindern, wenn bestimmte Abhängigkeiten vorhanden sind.

Wenn eine Einschränkung aktiviert ist, überprüft die Datenbank die Daten, während sie eingegeben oder aktualisiert werden. Oracle Database verhindert, dass Daten eingegeben werden, die der Einschränkung nicht entsprechen. Wenn eine Einschränkung deaktiviert ist, lässt Oracle Database Daten, die der Einschränkung nicht entsprechen, in die Datenbank zu.

In Beispiel 2-1 gibt die CREATE TABLE-Anweisung NOT NULL-Einschränkungen für die Spalten last_name , email , Hire_date und job_id an. Die Einschränkungsklauseln identifizieren die Spalten und die Bedingungen der Einschränkung. Diese Einschränkungen stellen sicher, dass die angegebenen Spalten keine Nullwerte enthalten. Beispielsweise führt der Versuch, einen neuen Mitarbeiter ohne Job-ID einzufügen, zu einem Fehler.

Sie können eine Einschränkung erstellen, wenn oder nachdem Sie eine Tabelle erstellt haben. Sie können Einschränkungen bei Bedarf vorübergehend deaktivieren. Die Datenbank speichert Einschränkungen im Datenwörterbuch.

"Datenintegrität", um mehr über Integritätsbeschränkungen zu erfahren

"Übersicht über das Datenwörterbuch", um mehr über das Datenwörterbuch zu erfahren

Oracle Database SQL Language Reference, um mehr über SQL-Einschränkungsklauseln zu erfahren

Tischspeicher

Oracle Database verwendet a Datensegment in einem Tablespace, um Tabellendaten zu speichern.

Ein Segment enthält Extents, die aus Datenblöcken bestehen. Das Datensegment für eine Tabelle (oder Cluster-Datensegment für einen Tabellencluster) befindet sich entweder im Standardtabellenbereich des Tabelleneigners oder in einem Tabellenbereich, der in der Anweisung CREATE TABLE benannt wurde.

"Benutzersegmente", um mehr über die Arten von Segmenten und deren Erstellung zu erfahren

Tabellenorganisation

Standardmäßig ist eine Tabelle als Heap organisiert, was bedeutet, dass die Datenbank die Zeilen dort platziert, wo sie am besten passen, und nicht in einer benutzerdefinierten Reihenfolge. Somit ist eine im Heap organisierte Tabelle eine ungeordnete Sammlung von Zeilen.

Indexorganisierte Tabellen verwenden ein anderes Organisationsprinzip.

Wenn Benutzer Zeilen hinzufügen, platziert die Datenbank die Zeilen im ersten verfügbaren freien Speicherplatz im Datensegment. Es wird nicht garantiert, dass Zeilen in der Reihenfolge abgerufen werden, in der sie eingefügt wurden.

Die Tabelle hr.departments ist eine im Heap organisierte Tabelle. Es enthält Spalten für Abteilungs-ID, Name, Manager-ID und Standort-ID. Wenn Zeilen eingefügt werden, speichert die Datenbank sie, wo sie passen. Ein Datenblock im Tabellensegment kann die im folgenden Beispiel gezeigten ungeordneten Zeilen enthalten:

Die Spaltenreihenfolge ist für alle Zeilen einer Tabelle gleich. Die Datenbank speichert Spalten normalerweise in der Reihenfolge, in der sie in der CREATE TABLE-Anweisung aufgelistet wurden, aber diese Reihenfolge kann nicht garantiert werden. Wenn eine Tabelle beispielsweise eine Spalte vom Typ LONG hat, speichert Oracle Database diese Spalte immer als letzte in der Zeile. Auch wenn Sie einer Tabelle eine neue Spalte hinzufügen, wird die neue Spalte die letzte gespeicherte Spalte.

Eine Tabelle kann eine virtuelle Spalte enthalten, die im Gegensatz zu normalen Spalten keinen Speicherplatz auf der Festplatte beansprucht. Die Datenbank leitet die Werte in einer virtuellen Spalte bei Bedarf ab, indem sie einen Satz benutzerdefinierter Ausdrücke oder Funktionen berechnet. Sie können virtuelle Spalten indizieren, Statistiken dazu sammeln und Integritätseinschränkungen erstellen. Somit sind virtuelle Spalten ähnlich wie nicht virtuelle Spalten.

Reihenspeicher

Die Datenbank speichert Zeilen in Datenblöcken. Jede Zeile einer Tabelle, die Daten für weniger als 256 Spalten enthält, ist in einem oder mehreren Zeilenteilen enthalten.

Wenn möglich, speichert Oracle Database jede Zeile als ein Zeilenstück . Wenn jedoch nicht alle Zeilendaten in einen einzelnen Datenblock eingefügt werden können oder wenn eine Aktualisierung einer vorhandenen Zeile dazu führt, dass die Zeile über ihren Datenblock hinauswächst, speichert die Datenbank die Zeile unter Verwendung mehrerer Zeilenteile.

Zeilen in einem Tabellencluster enthalten dieselben Informationen wie Zeilen in nicht gruppierten Tabellen. Darüber hinaus enthalten Zeilen in einem Tabellencluster Informationen, die auf den Clusterschlüssel verweisen, zu dem sie gehören.

"Datenblockformat", um mehr über die Komponenten eines Datenblocks zu erfahren

Rowids of Row Pieces

EIN Rowid ist effektiv eine physikalische 10-Byte-Adresse einer Zeile.

Jede Zeile in einer im Heap organisierten Tabelle hat eine eindeutige Zeilen-ID für diese Tabelle, die der physischen Adresse eines Zeilenteils entspricht. Bei Tabellenclustern können Zeilen in verschiedenen Tabellen, die sich im selben Datenblock befinden, dieselbe Zeilen-ID haben.

Oracle Database verwendet intern Rowids für die Erstellung von Indizes. Beispielsweise ist jedem Schlüssel in einem B-Baum-Index eine Zeilen-ID zugeordnet, die für einen schnellen Zugriff auf die Adresse der zugeordneten Zeile zeigt. Physische Rowids bieten den schnellstmöglichen Zugriff auf eine Tabellenzeile, sodass die Datenbank eine Zeile mit nur einer einzigen E/A abrufen kann.

"Rowid-Format", um mehr über die Struktur eines Rowids zu erfahren

"Übersicht über B-Tree-Indizes", um mehr über die Arten und den Aufbau von B-Tree-Indizes zu erfahren

Speicherung von Nullwerten

Eine Null ist das Fehlen eines Werts in einer Spalte. Nullen weisen auf fehlende, unbekannte oder nicht anwendbare Daten hin.

Nullen werden in der Datenbank gespeichert, wenn sie zwischen Spalten mit Datenwerten liegen. In diesen Fällen benötigen sie 1 Byte, um die Länge der Spalte (Null) zu speichern. Nachfolgende Nullen in einer Zeile erfordern keine Speicherung, da ein neuer Zeilenkopf signalisiert, dass die verbleibenden Spalten in der vorherigen Zeile null sind. Wenn beispielsweise die letzten drei Spalten einer Tabelle null sind, werden für diese Spalten keine Daten gespeichert.

Tabellenkomprimierung

Die Datenbank kann die Tabellenkomprimierung verwenden, um den für die Tabelle erforderlichen Speicherplatz zu reduzieren.

Die Komprimierung spart Speicherplatz, reduziert die Speichernutzung im Datenbankpuffercache und beschleunigt in einigen Fällen die Ausführung von Abfragen. Die Tabellenkomprimierung ist für Datenbankanwendungen transparent.

Grundlegende Tabellenkomprimierung und erweiterte Zeilenkomprimierung

Die wörterbuchbasierte Tabellenkomprimierung bietet gute Komprimierungsverhältnisse für im Heap organisierte Tabellen.

Oracle Database unterstützt die folgenden Arten der wörterbuchbasierten Tabellenkomprimierung:

Diese Art der Komprimierung ist für Massenladevorgänge vorgesehen. Die Datenbank komprimiert keine Daten, die mit herkömmlicher DML geändert wurden. Sie müssen INSERT-Operationen mit direktem Pfad ALTER TABLE verwenden. . . MOVE-Operationen oder Online-Tabellenredefinition, um eine grundlegende Tabellenkomprimierung zu erreichen.

Diese Art der Komprimierung ist für OLTP-Anwendungen vorgesehen und komprimiert Daten, die durch eine beliebige SQL-Operation manipuliert werden. Die Datenbank erreicht ein konkurrenzfähiges Komprimierungsverhältnis, während die Anwendung DML in ungefähr der gleichen Zeit wie DML auf einer unkomprimierten Tabelle ausführen kann.

Bei den vorhergehenden Komprimierungstypen speichert die Datenbank komprimierte Zeilen im Zeilenhauptformat . Alle Spalten einer Zeile werden zusammen gespeichert, gefolgt von allen Spalten der nächsten Zeile usw. Die Datenbank ersetzt doppelte Werte durch einen kurzen Verweis auf eine Symboltabelle, die am Anfang des Blocks gespeichert ist. Somit werden Informationen, die die Datenbank benötigt, um die unkomprimierten Daten neu zu erstellen, im Datenblock selbst gespeichert.

Komprimierte Datenblöcke sehen aus wie normale Datenblöcke. Die meisten Datenbankfeatures und -funktionen, die mit regulären Datenblöcken arbeiten, funktionieren auch mit komprimierten Blöcken.

Sie können die Komprimierung auf Tabellenbereichs-, Tabellen-, Partitions- oder Unterpartitionsebene deklarieren. Wenn auf Tabellenbereichsebene angegeben, werden alle im Tabellenbereich erstellten Tabellen standardmäßig komprimiert.

Beispiel 2-4 Komprimierung auf Tabellenebene

Die folgende Anweisung wendet die erweiterte Zeilenkomprimierung auf die Orders-Tabelle an:

Beispiel 2-5 Komprimierung auf Partitionsebene

Das folgende Beispiel einer partiellen CREATE TABLE-Anweisung gibt die erweiterte Zeilenkomprimierung für eine Partition und die grundlegende Tabellenkomprimierung für die andere Partition an:

"Zeilenformat", um zu erfahren, wie Werte in einer Reihe gespeichert werden

"Datenblockkomprimierung", um mehr über das Format komprimierter Datenblöcke zu erfahren

"SQL*Loader", um mehr über die Verwendung von SQL*Loader für direkte Pfadladungen zu erfahren

Hybride Säulenkompression

Bei der hybriden Spaltenkomprimierung speichert die Datenbank dieselbe Spalte für eine Gruppe von Zeilen zusammen. Der Datenblock speichert keine Daten im Zeilenhauptformat, sondern verwendet eine Kombination aus Zeilen- und Spaltenmethoden.

Das gemeinsame Speichern von Spaltendaten mit demselben Datentyp und ähnlichen Eigenschaften erhöht die durch die Komprimierung erzielten Speichereinsparungen erheblich. Die Datenbank komprimiert Daten, die durch eine beliebige SQL-Operation manipuliert wurden, obwohl die Komprimierungsstufen für direkte Pfadlasten höher sind. Datenbankoperationen arbeiten transparent gegen komprimierte Objekte, sodass keine Anwendungsänderungen erforderlich sind.

Hybrid Column Compression und In-Memory Column Store (IM-Spaltenspeicher) sind eng verwandt. Der Hauptunterschied besteht darin, dass die Hybrid-Spaltenkomprimierung den Plattenspeicher optimiert, während der IM-Spaltenspeicher die Speicherspeicherung optimiert.

"In-Memory-Bereich", um mehr über den IM-Spaltenspeicher zu erfahren

Arten der hybriden säulenförmigen Kompression

Wenn Ihr zugrundeliegender Speicher die hybride spaltenförmige Komprimierung unterstützt, können Sie je nach Ihren Anforderungen verschiedene Komprimierungstypen angeben.

Die Komprimierungsoptionen sind:

Diese Art der Komprimierung ist optimiert, um Speicherplatz zu sparen, und ist für Data Warehouse-Anwendungen vorgesehen.

Diese Art der Komprimierung ist für maximale Komprimierungsstufen optimiert und für historische Daten und Daten vorgesehen, die sich nicht ändern.

Hybrid Columnar Compression ist für Data Warehousing- und Entscheidungsunterstützungsanwendungen auf Oracle Exadata-Speicher optimiert. Oracle Exadata maximiert die Leistung von Abfragen für Tabellen, die mit Hybrid Columnar Compression komprimiert wurden, und nutzt die Verarbeitungsleistung, den Arbeitsspeicher und die Infiniband-Netzwerkbandbreite, die integraler Bestandteil des Oracle Exadata-Speicherservers sind.

Andere Oracle-Speichersysteme unterstützen die hybride spaltenförmige Komprimierung und bieten die gleichen Platzeinsparungen wie bei Oracle Exadata-Speicher, liefern jedoch nicht die gleiche Abfrageleistung. Für diese Speichersysteme ist Hybrid Columnar Compression ideal für die datenbankinterne Archivierung älterer Daten, auf die selten zugegriffen wird.

Kompressionseinheiten

Hybrid Columnar Compression verwendet ein logisches Konstrukt namens a Kompressionseinheit um eine Reihe von Zeilen zu speichern.

Wenn Sie Daten in eine Tabelle laden, speichert die Datenbank Gruppen von Zeilen im Spaltenformat, wobei die Werte für jede Spalte gespeichert und zusammen komprimiert werden. Nachdem die Datenbank die Spaltendaten für einen Satz von Zeilen komprimiert hat, passt die Datenbank die Daten in die Komprimierungseinheit ein.

Sie wenden beispielsweise die hybride Spaltenkomprimierung auf eine daily_sales-Tabelle an. Am Ende jedes Tages füllen Sie die Tabelle mit Artikeln und der verkauften Anzahl, wobei die Artikel-ID und das Datum einen zusammengesetzten Primärschlüssel bilden. Die folgende Tabelle zeigt eine Teilmenge der Zeilen in daily_sales .

Tabelle 2-2 Beispieltabelle daily_sales

Angenommen, diese Teilmenge von Zeilen wird in einer Komprimierungseinheit gespeichert. Hybrid Columnar Compression speichert die Werte für jede Spalte zusammen und verwendet dann mehrere Algorithmen, um jede Spalte zu komprimieren. Die Datenbank wählt die Algorithmen basierend auf einer Vielzahl von Faktoren aus, einschließlich des Datentyps der Spalte, der Kardinalität der tatsächlichen Werte in der Spalte und der vom Benutzer gewählten Komprimierungsstufe.

Wie die folgende Grafik zeigt, kann sich jede Komprimierungseinheit über mehrere Datenblöcke erstrecken. Die Werte für eine bestimmte Spalte können mehrere Blöcke umfassen oder nicht.

Abbildung 2-4 Kompressionseinheit

Wenn die hybride Spaltenkomprimierung nicht zu Platzeinsparungen führt, speichert die Datenbank die Daten im Format DBMS_COMPRESSION.COMP_BLOCK. In diesem Fall wendet die Datenbank die OLTP-Komprimierung auf die Blöcke an, die sich in einem Hybrid Columnar Compression-Segment befinden.

Oracle Database Licensing Information User Manual, um mehr über die Lizenzanforderungen für Hybrid Columnar Compression zu erfahren

Oracle Database Administrator’s Guide zum Erlernen der Verwendung von Hybrid Columnar Compression

Oracle Database SQL-Sprachreferenz für CREATE TABLE-Syntax und -Semantik

DML und Hybrid Columnar Compression

Die hybride Spaltenkomprimierung hat Auswirkungen auf die Zeilensperrung in verschiedenen Arten von DML-Vorgängen.

Direkte Pfadbelastungen und konventionelle Wendeschneidplatten

Beim Laden von Daten in eine Tabelle, die Hybrid Columnar Compression verwendet, können Sie entweder konventionelle Einfügungen oder direkte Pfadladevorgänge verwenden. Direkte Pfadladevorgänge sperren die gesamte Tabelle, wodurch die Parallelität verringert wird.

Oracle Database 12c Release 2 (12.2) fügt Unterstützung für konventionelle Array-Einfügungen in das Hybrid Columnar Compression-Format hinzu. Die Vorteile herkömmlicher Array-Einsätze sind:

Eingefügte Zeilen verwenden Sperren auf Zeilenebene, was die Parallelität erhöht.

Automatische Datenoptimierung (ADO) und Heatmap unterstützen Hybrid Columnar Compression für Richtlinien auf Zeilenebene. Somit kann die Datenbank die Hybrid Columnar Compression für geeignete Blöcke verwenden, selbst wenn DML-Aktivität in anderen Teilen des Segments auftritt.

Wenn die Anwendung herkömmliche Array-Einfügungen verwendet, speichert Oracle Database die Zeilen in Komprimierungseinheiten, wenn die folgenden Bedingungen erfüllt sind:

Die Tabelle wird in einem ASSM-Tablespace gespeichert.

Der Kompatibilitätsgrad ist 12.2.0.1 oder höher.

Die Tabellendefinition erfüllt die vorhandenen Tabelleneinschränkungen für die hybride Spaltenkomprimierung, einschließlich keine Spalten vom Typ LONG und keine Zeilenabhängigkeiten.

Herkömmliche Einfügungen erzeugen Redo und Undo. Somit werden Komprimierungseinheiten, die durch herkömmliche DML-Anweisungen erstellt wurden, zusammen mit der DML zurückgesetzt oder festgeschrieben. Die Datenbank führt automatisch eine Indexpflege durch, genau wie bei Zeilen, die in herkömmlichen Datenblöcken gespeichert sind.

Standardmäßig sperrt die Datenbank alle Zeilen in der Komprimierungseinheit, wenn eine Aktualisierung oder Löschung auf eine beliebige Zeile in der Einheit angewendet wird. Um dieses Problem zu vermeiden, können Sie das Sperren auf Zeilenebene für eine Tabelle aktivieren. In diesem Fall sperrt die Datenbank nur Zeilen, die von der Aktualisierungs- oder Löschoperation betroffen sind.

Oracle Database Administrator’s Guide zum Erlernen konventioneller Einfügungen

Übersicht über Tabellencluster

EIN Tabellencluster ist eine Gruppe von Tabellen, die gemeinsame Spalten teilen und verwandte Daten in denselben Blöcken speichern.

Wenn Tabellen geclustert werden, kann ein einzelner Datenblock Zeilen aus mehreren Tabellen enthalten. Ein Block kann beispielsweise Zeilen aus den Tabellen "Mitarbeiter" und "Abteilungen" speichern und nicht nur aus einer einzigen Tabelle.

Der Clusterschlüssel ist die Spalte oder Spalten, die die geclusterten Tabellen gemeinsam haben. Beispielsweise teilen sich die Tabellen "personals" und "departments" die Spalte "department_id". Sie geben den Clusterschlüssel beim Erstellen des Tabellenclusters und beim Erstellen jeder Tabelle an, die dem Tabellencluster hinzugefügt wird.

Der Clusterschlüsselwert ist der Wert der Clusterschlüsselspalten für einen bestimmten Satz von Zeilen. Alle Daten, die denselben Clusterschlüsselwert enthalten, z. B. Department_id=20 , werden physisch zusammen gespeichert. Jeder Clusterschlüsselwert wird nur einmal im Cluster und im Clusterindex gespeichert, unabhängig davon, wie viele Zeilen verschiedener Tabellen den Wert enthalten.

Nehmen wir als Analogie an, ein Personalleiter hat zwei Bücherregale: einen mit Kartons mit Mitarbeiterordnern und den anderen mit Kartons mit Abteilungsordnern. Benutzer fragen oft nach den Ordnern für alle Mitarbeiter einer bestimmten Abteilung. Um das Auffinden zu erleichtern, ordnet der Manager alle Kartons in einem einzigen Bücherregal neu an. Sie teilt die Boxen nach Abteilungs-ID ein. Somit befinden sich alle Ordner für Angestellte in Abteilung 20 und der Ordner für Abteilung 20 selbst in einem Kasten, die Ordner für Angestellte in Abteilung 100 und der Ordner für Abteilung 100 befinden sich in einem anderen Kasten und so weiter.

Ziehen Sie das Clustern von Tabellen in Betracht, wenn sie hauptsächlich abgefragt (aber nicht geändert) werden und Datensätze aus den Tabellen häufig zusammen abgefragt oder verbunden werden. Da Tabellencluster verwandte Zeilen verschiedener Tabellen in denselben Datenblöcken speichern, bieten ordnungsgemäß verwendete Tabellencluster die folgenden Vorteile gegenüber Tabellen ohne Cluster:

Platten-E/A wird für Joins von Cluster-Tabellen reduziert.

Die Zugriffszeit für Joins von Cluster-Tabellen wird verbessert.

Es wird weniger Speicherplatz benötigt, um verknüpfte Tabellen- und Indexdaten zu speichern, da der Clusterschlüsselwert nicht wiederholt für jede Zeile gespeichert wird.

In der Regel ist das Clustern von Tabellen in den folgenden Situationen nicht geeignet:

Die Tabellen werden regelmäßig aktualisiert.

Die Tabellen erfordern häufig einen vollständigen Tabellenscan.

Die Tabellen müssen abgeschnitten werden.

Übersicht über indizierte Cluster

Ein Indexcluster ist ein Tabellencluster, der einen Index zum Auffinden von Daten verwendet. Der Cluster-Index ist ein B-Baum-Index auf dem Cluster-Schlüssel. Ein Clusterindex muss erstellt werden, bevor Zeilen in Clustertabellen eingefügt werden können.

Beispiel 2-6 Erstellen eines Tabellenclusters und eines zugehörigen Index

Angenommen, Sie erstellen den Cluster employee_departments_cluster mit dem Clusterschlüssel Department_id , wie im folgenden Beispiel gezeigt:

Da die HASHKEYS-Klausel nicht angegeben ist, ist employee_departments_cluster ein indizierter Cluster. Im vorherigen Beispiel wird ein Index namens idx_emp_dept_cluster für den Clusterschlüssel Department_id erstellt.

Beispiel 2-7 Erstellen von Tabellen in einem indizierten Cluster

Sie erstellen die Tabellen "personals" und "departments" im Cluster, indem Sie die Spalte "department_id" als Cluster-Schlüssel angeben (die Ellipsen markieren die Stelle, an der die Spaltenspezifikation steht):

Angenommen, Sie fügen Zeilen zu den Tabellen "Mitarbeiter" und "Abteilungen" hinzu. Die Datenbank speichert physisch alle Zeilen für jede Abteilung aus den Tabellen „Mitarbeiter“ und „Abteilungen“ in denselben Datenblöcken. Die Datenbank speichert die Zeilen in einem Heap und lokalisiert sie mit dem Index.

Abbildung 2-5 zeigt den Tabellencluster employee_departments_cluster, der die Mitarbeiter und Abteilungen enthält. Die Datenbank speichert Zeilen für Mitarbeiter in Abteilung 20 zusammen, Abteilung 110 zusammen und so weiter. Wenn die Tabellen nicht geclustert sind, stellt die Datenbank nicht sicher, dass die zugehörigen Zeilen zusammen gespeichert werden.

Abbildung 2-5 Geclusterte Tabellendaten

Der B-Baum-Clusterindex ordnet den Clusterschlüsselwert der Datenbankblockadresse (DBA) des Blocks zu, der die Daten enthält.Der Indexeintrag für Schlüssel 20 zeigt beispielsweise die Adresse des Blocks an, der Daten für Mitarbeiter der Abteilung 20 enthält:

Der Clusterindex wird wie ein Index für eine nicht gruppierte Tabelle separat verwaltet und kann in einem vom Tabellencluster getrennten Tablespace vorhanden sein.

Oracle Database Administrator’s Guide, um zu erfahren, wie indizierte Cluster erstellt und verwaltet werden

Oracle Database SQL-Sprachreferenz für CREATE CLUSTER-Syntax und -Semantik

Übersicht über Hash-Cluster

Ein Hash-Cluster ist wie ein indizierter Cluster, außer dass der Indexschlüssel durch eine Hash-Funktion ersetzt wird. Es existiert kein separater Clusterindex. In einem Hash-Cluster sind die Daten der Index.

Bei einer indizierten Tabelle oder einem indizierten Cluster sucht Oracle Database Tabellenzeilen mithilfe von Schlüsselwerten, die in einem separaten Index gespeichert sind. Um eine Zeile in einer indizierten Tabelle oder einem Tabellencluster zu finden oder zu speichern, muss die Datenbank mindestens zwei E/A-Vorgänge ausführen:

Ein oder mehrere I/Os zum Suchen oder Speichern des Schlüsselwerts im Index

Ein weiterer I/O zum Lesen oder Schreiben der Zeile in der Tabelle oder dem Tabellencluster

Um eine Zeile in einem Hash-Cluster zu finden oder zu speichern, wendet Oracle Database die Hash-Funktion auf den Cluster-Schlüsselwert der Zeile an. Der resultierende Hash-Wert entspricht einem Datenblock im Cluster, den die Datenbank im Auftrag der ausgegebenen Anweisung liest oder schreibt.

Hashing ist eine optionale Möglichkeit zum Speichern von Tabellendaten, um die Leistung des Datenabrufs zu verbessern. Hash-Cluster können von Vorteil sein, wenn die folgenden Bedingungen erfüllt sind:

Eine Tabelle wird viel häufiger abgefragt als geändert.

Die Hash-Schlüsselspalte wird häufig mit Gleichheitsbedingungen abgefragt, beispielsweise WHERE Department_id=20 . Für solche Abfragen wird der Clusterschlüsselwert gehasht. Der Hash-Schlüsselwert zeigt direkt auf den Plattenbereich, der die Zeilen speichert.

Sie können die Anzahl der Hash-Schlüssel und die Größe der mit jedem Schlüsselwert gespeicherten Daten vernünftig erraten.

Hash-Cluster-Erstellung

Um einen Hash-Cluster zu erstellen, verwenden Sie dieselbe CREATE CLUSTER-Anweisung wie für einen indizierten Cluster, mit dem Zusatz eines Hash-Schlüssels. Die Anzahl der Hashwerte für den Cluster hängt vom Hashschlüssel ab.

Der Clusterschlüssel ist wie der Schlüssel eines indizierten Clusters ein einzelner Spalten- oder zusammengesetzter Schlüssel, der von den Tabellen im Cluster gemeinsam genutzt wird. Ein Hashschlüsselwert ist ein tatsächlicher oder möglicher Wert, der in die Clusterschlüsselspalte eingefügt wird. Wenn der Clusterschlüssel beispielsweise division_id ist, können die Hashschlüsselwerte 10, 20, 30 usw. sein.

Oracle Database verwendet eine Hash-Funktion, die eine unendliche Anzahl von Hash-Schlüsselwerten als Eingabe akzeptiert und sie in eine endliche Anzahl von Buckets sortiert. Jeder Bucket hat eine eindeutige numerische ID, die als Hash-Wert bezeichnet wird. Jeder Hashwert wird der Datenbankblockadresse für den Block zugeordnet, der die Zeilen speichert, die dem Hashschlüsselwert entsprechen (Abteilung 10, 20, 30 usw.).

Im folgenden Beispiel beträgt die Anzahl der wahrscheinlich existierenden Abteilungen 100, daher wird HASHKEYS auf 100 gesetzt:

Nachdem Sie employee_departments_cluster erstellt haben, können Sie die Tabellen für die Mitarbeiter und Abteilungen im Cluster erstellen. Sie können dann Daten in den Hash-Cluster wie in den indizierten Cluster laden.

Oracle Database Administrator’s Guide zum Erstellen und Verwalten von Hash-Clustern

Hash-Cluster-Abfragen

Bei Abfragen eines Hash-Clusters bestimmt die Datenbank, wie die vom Benutzer eingegebenen Schlüsselwerte gehasht werden.

Benutzer führen beispielsweise häufig Abfragen wie die folgenden aus und geben verschiedene Abteilungs-ID-Nummern für p_id ein:

Wenn ein Benutzer Mitarbeiter in Department_id =20 abfragt, könnte die Datenbank diesen Wert in Bucket 77 abfragen. Wenn ein Benutzer Mitarbeiter in Department_id = 10 abfragt, dann könnte die Datenbank diesen Wert in Bucket 15 hashen. Die Datenbank verwendet den intern generierten Hash-Wert um den Block zu finden, der die Mitarbeiterzeilen für die angeforderte Abteilung enthält.

Die folgende Abbildung zeigt ein Hash-Cluster-Segment als horizontale Reihe von Blöcken. Wie in der Grafik dargestellt, kann eine Abfrage Daten in einem einzelnen E/A abrufen.

Abbildung 2-6 Abrufen von Daten aus einem Hash-Cluster

Eine Einschränkung von Hash-Clustern ist die Nichtverfügbarkeit von Bereichsscans auf nicht indizierten Clusterschlüsseln. Angenommen, es existiert kein separater Index für den Hash-Cluster, der in der Hash-Cluster-Erstellung erstellt wurde. Eine Abfrage nach Abteilungen mit IDs zwischen 20 und 100 kann den Hashing-Algorithmus nicht verwenden, da er nicht jeden möglichen Wert zwischen 20 und 100 hashen kann. Da kein Index vorhanden ist, muss die Datenbank einen vollständigen Scan durchführen.

Hash-Cluster-Variationen

Ein Single-Table-Hash-Cluster ist eine optimierte Version eines Hash-Clusters, der jeweils nur eine Tabelle unterstützt. Zwischen Hash-Schlüsseln und Zeilen besteht eine Eins-zu-Eins-Zuordnung.

Ein Einzeltabellen-Hash-Cluster kann von Vorteil sein, wenn Benutzer einen schnellen Zugriff auf eine Tabelle über den Primärschlüssel benötigen. Benutzer suchen beispielsweise häufig einen Mitarbeiterdatensatz in der Mitarbeitertabelle nach Mitarbeiter_ID .

Ein sortierter Hash-Cluster speichert die Zeilen, die jedem Wert der Hash-Funktion entsprechen, so, dass die Datenbank sie effizient in sortierter Reihenfolge zurückgeben kann. Die Datenbank führt die optimierte Sortierung intern durch. Für Anwendungen, die Daten immer in sortierter Reihenfolge verbrauchen, kann diese Technik einen schnelleren Abruf von Daten bedeuten. Beispielsweise kann eine Anwendung immer nach der Spalte order_date der Tabelle "orders" sortieren.

Oracle Database Administrator’s Guide zum Erstellen von Einzeltabellen- und sortierten Hash-Clustern

Hash-Cluster-Speicher

Oracle Database ordnet Speicherplatz für einen Hash-Cluster anders zu als für einen indizierten Cluster.

Im Beispiel in der Hash-Cluster-Erstellung gibt HASHKEYS die Anzahl der wahrscheinlich existierenden Abteilungen an, während SIZE die Größe der Daten angibt, die jeder Abteilung zugeordnet sind. Die Datenbank berechnet einen Speicherplatzwert basierend auf der folgenden Formel:

Beträgt die Blockgröße in dem in Hash-Cluster-Erstellung gezeigten Beispiel also 4096 Byte, weist die Datenbank dem Hash-Cluster mindestens 200 Blöcke zu.

Oracle Database beschränkt die Anzahl der Hashschlüsselwerte, die Sie in den Cluster einfügen können, nicht. Obwohl HASHKEYS beispielsweise 100 ist, hindert Sie nichts daran, 200 eindeutige Abteilungen in die Abteilungstabelle einzufügen. Die Effizienz des Hash-Cluster-Abrufs nimmt jedoch ab, wenn die Anzahl der Hash-Werte die Anzahl der Hash-Schlüssel überschreitet.

Um die Abrufprobleme zu veranschaulichen, sei angenommen, dass Block 100 in Abbildung 2-6 vollständig mit Zeilen für Abteilung 20 gefüllt ist. Ein Benutzer fügt eine neue Abteilung mit der Abteilungs-ID 43 in die Abteilungstabelle ein. Die Anzahl der Abteilungen überschreitet den HASHKEYS-Wert, daher hasht die Datenbank die Abteilungs-ID 43 auf den Hash-Wert 77, der derselbe Hash-Wert ist, der für Abteilungs_ID 20 verwendet wird. Das Hashen mehrerer Eingabewerte auf denselben Ausgabewert wird als Hash-Kollision bezeichnet.

Wenn Benutzer Zeilen in den Cluster für Abteilung 43 einfügen, kann die Datenbank diese Zeilen nicht in Block 100 speichern, der voll ist. Die Datenbank verknüpft Block 100 mit einem neuen Überlaufblock, beispielsweise Block 200, und speichert die eingefügten Zeilen in dem neuen Block. Sowohl Block 100 als auch Block 200 sind nun berechtigt, Daten für eine der beiden Abteilungen zu speichern. Wie in Abbildung 2-7 gezeigt, erfordert eine Abfrage von entweder Abteilung 20 oder 43 jetzt zwei I/Os, um die Daten abzurufen: Block 100 und der zugehörige Block 200. Sie können dieses Problem lösen, indem Sie den Cluster mit einem anderen HASHKEYS neu erstellen Wert.

Abbildung 2-7 Abrufen von Daten aus einem Hash-Cluster, wenn eine Hash-Kollision auftritt

Oracle Database Administrator’s Guide zum Verwalten von Speicherplatz in Hash-Clustern

Übersicht über Attribute-Cluster-Tabellen

Eine nach Attributen geclusterte Tabelle ist eine im Heap organisierte Tabelle, die Daten basierend auf benutzerdefinierten Clustering-Anweisungen in unmittelbarer Nähe auf der Festplatte speichert. Die Anweisungen geben Spalten in einzelnen oder mehreren Tabellen an.

Die Richtlinien lauten wie folgt:

Das CLUSTERING. Die Direktive BY LINEAR ORDER ordnet Daten in einer Tabelle nach angegebenen Spalten.

Erwägen Sie die Verwendung von BY LINEAR ORDER-Clustering (Standardeinstellung), wenn Abfragen das Präfix der in der Clustering-Klausel angegebenen Spalten qualifizieren. Wenn beispielsweise Abfragen von sh.sales häufig entweder eine Kunden-ID oder sowohl eine Kunden-ID als auch eine Produkt-ID angeben, können Sie Daten in der Tabelle mithilfe der linearen Spaltenreihenfolge cust_id , prod_id clustern.

Das CLUSTERING. Die Direktive BY INTERLEAVED ORDER ordnet Daten in einer oder mehreren Tabellen unter Verwendung eines speziellen Algorithmus, ähnlich einer Funktion der Z-Reihenfolge, die eine mehrspaltige E/A-Reduktion ermöglicht.

Ziehen Sie die Verwendung von BY INTERLEAVED ORDER-Clustering in Betracht, wenn Abfragen eine Vielzahl von Spaltenkombinationen angeben. Wenn beispielsweise Abfragen von sh.sales unterschiedliche Dimensionen in verschiedenen Bestellungen angeben, können Sie Daten in der Verkaufstabelle nach Spalten in diesen Dimensionen gruppieren.

Attributclustering ist nur für INSERT-Operationen mit direktem Pfad verfügbar. Sie wird bei konventioneller DML ignoriert.

Dieser Abschnitt enthält die folgenden Themen:

Vorteile von Attribute-Clustered-Tabellen

Der Hauptvorteil von Tabellen mit Attributecluster ist die E/A-Reduzierung, die die E/A-Kosten und die CPU-Kosten von Tabellenscans erheblich reduzieren kann. Die E/A-Reduzierung erfolgt entweder mit Zonen oder durch Reduzierung der physischen E/A durch eine engere physische Nähe auf der Festplatte für die geclusterten Werte.

Eine nach Attributen geclusterte Tabelle hat die folgenden Vorteile:

Sie können Faktentabellen basierend auf Dimensionsspalten in Sternschemas gruppieren.

In Sternschemas qualifizieren die meisten Abfragen Dimensionstabellen und keine Faktentabellen, sodass das Clustern nach Faktentabellenspalten nicht effektiv ist. Oracle Database unterstützt Clustering für Spalten in Dimensionstabellen.

Die E/A-Reduzierung kann in verschiedenen Szenarien auftreten:

Bei Verwendung mit Oracle Exadata Storage-Indizes, Oracle In-Memory Min/Max-Pruning oder Zonenzuordnungen

In OLTP-Anwendungen für Abfragen, die ein Präfix qualifizieren und Attributclustering mit linearer Reihenfolge verwenden use

In einer Teilmenge der Clustering-Spalten für das Clustering BY INTERLEAVED ORDER

Attribut-Clustering kann die Datenkomprimierung verbessern und auf diese Weise indirekt die Kosten für Tabellenscans senken.

Wenn dieselben Werte auf der Festplatte nahe beieinander liegen, kann die Datenbank sie leichter komprimieren.

Für Oracle Database fallen nicht die Speicher- und Wartungskosten eines Index an.

Oracle Database Data Warehousing Guide für weitere Vorteile von Tabellen mit Attributecluster

Attributclustertabellen beitreten

Attribut-Clustering, das auf verknüpften Spalten basiert, wird als Join-Attribut-Clustering bezeichnet. Im Gegensatz zu Tabellenclustern speichern geclusterte Tabellen mit Join-Attributen keine Daten aus einer Gruppe von Tabellen in denselben Datenbankblöcken.

Betrachten Sie beispielsweise eine mit Attributen geclusterte Tabelle sales , die mit einer Dimensionstabelle verknüpft ist, products . Die Verkaufstabelle enthält nur Zeilen aus der Verkaufstabelle, aber die Reihenfolge der Zeilen basiert auf den Werten der Spalten, die aus der Produkttabelle verbunden sind. Der entsprechende Join wird während der Datenverschiebung, der direkten Pfadeinfügung und der CREATE TABLE AS SELECT-Operationen ausgeführt. Im Gegensatz dazu würden die Datenblöcke, wenn sich Verkäufe und Produkte in einem Standardtabellencluster befinden, Zeilen aus beiden Tabellen enthalten.

Oracle Database Data Warehousing-Leitfaden, um mehr über das Clustering von Join-Attributen zu erfahren

E/A-Reduktion mit Zonen

EIN Zone ist ein Satz zusammenhängender Datenblöcke, der die Mindest- und Höchstwerte relevanter Spalten speichert.

Wenn eine SQL-Anweisung Prädikate für Spalten enthält, die in einer Zone gespeichert sind, vergleicht die Datenbank die Prädikatswerte mit dem in der Zone gespeicherten Minimum und Maximum. Auf diese Weise bestimmt die Datenbank, welche Zonen während der SQL-Ausführung gelesen werden sollen.

Die E/A-Reduktion ist die Möglichkeit, Tabellen- oder Indexblöcke zu überspringen, die keine Daten enthalten, die die Datenbank zum Erfüllen einer Abfrage benötigt. Diese Reduzierung kann die E/A- und CPU-Kosten von Tabellenscans erheblich reduzieren.

Zonenkarten

Eine Zonenkarte ist eine unabhängige Zugriffsstruktur, die Datenblöcke in Zonen unterteilt. Oracle Database implementiert jede Zonenkarte als eine Art materialisierte Ansicht.

Wenn CLUSTERING für eine Tabelle angegeben wird, erstellt die Datenbank automatisch eine Zonenzuordnung für die angegebenen Clustering-Spalten. Die Zonenzuordnung korreliert Mindest- und Höchstwerte von Spalten mit aufeinanderfolgenden Datenblöcken in der Tabelle mit Attributclustern. Tabellen mit Attributeclustern verwenden Zonenzuordnungen, um die E/A-Reduktion durchzuführen.

Sie können Attributclustertabellen erstellen, die keine Zonenzuordnungen verwenden. Sie können auch Zonenzuordnungen ohne Tabellen mit Attributecluster erstellen. Sie können beispielsweise eine Zonenkarte für eine Tabelle erstellen, deren Zeilen natürlich in einer Reihe von Spalten angeordnet sind, wie z. B. eine Aktienhandelstabelle, deren Trades nach Zeit sortiert sind. Sie führen DDL-Anweisungen aus, um Zonenzuordnungen zu erstellen, zu löschen und zu verwalten.

Zweck der Zonen

Betrachten Sie für eine lose Analogie der Zonen einen Verkaufsleiter, der ein Bücherregal mit Schubladen verwendet, die analog zu Datenblöcken sind.

Jede Schublade hat Quittungen (Reihen), die die an einen Kunden verkauften Hemden beschreiben, sortiert nach Versanddatum. In dieser Analogie ist eine Zonenkarte wie ein Stapel Karteikarten. Jede Karte entspricht einer "Zone" (angrenzender Bereich) von Fächern, wie den Fächern 1-10. Für jede Zone listet die Karte das minimale und maximale Versanddatum für die in der Zone gespeicherten Belege auf.

Wenn jemand wissen möchte, welche Hemden an einem bestimmten Datum versandt wurden, dreht die Managerin die Karten um, bis sie den Datumsbereich erreicht, der das gewünschte Datum enthält, merkt sich die Schubladenzone und durchsucht dann nur Schubladen in dieser Zone nach den angeforderten Belegen. Auf diese Weise vermeidet der Manager, jede Schublade im Bücherregal nach den Quittungen zu durchsuchen.

So funktioniert eine Zonenkarte: Beispiel

Dieses Beispiel veranschaulicht, wie eine Zonenkarte Daten in einer Abfrage bereinigen kann, deren Prädikat eine Konstante enthält.

Angenommen, Sie erstellen die folgende Werbebuchungstabelle:

Die Tabellenzeile enthält 4 Datenblöcke mit 2 Zeilen pro Block. Tabelle 2-3 zeigt die 8 Zeilen der Tabelle.


Impala-DML-Unterstützung für Kudu-Tabellen (INSERT, UPDATE, DELETE, UPSERT)

Impala unterstützt nur bestimmte DML-Anweisungen für Kudu-Tabellen. Mit den Anweisungen UPDATE und DELETE können Sie Daten in Kudu-Tabellen ändern, ohne große Mengen an Tabellendaten neu schreiben zu müssen. Die UPSERT-Anweisung fungiert als Kombination aus INSERT und UPDATE , fügt Zeilen ein, in denen der Primärschlüssel noch nicht vorhanden ist, und aktualisiert die Nicht-Primärschlüsselspalten, in denen der Primärschlüssel bereits in der Tabelle vorhanden ist.

Die INSERT-Anweisung für Kudu-Tabellen berücksichtigt die Unique- und NOT NULL-Anforderungen für die Primärschlüsselspalten.

Da Impala und Kudu keine Transaktionen unterstützen, sind die Auswirkungen jeder INSERT-, UPDATE- oder DELETE-Anweisung sofort sichtbar. Sie können beispielsweise keine Folge von UPDATE-Anweisungen ausführen und die Änderungen erst sichtbar machen, nachdem alle Anweisungen abgeschlossen sind. Auch wenn eine DML-Anweisung teilweise fehlschlägt, bleiben alle Zeilen, die bereits eingefügt, gelöscht oder geändert wurden, in der Tabelle erhalten. Es gibt keinen Rollback-Mechanismus, um die Änderungen rückgängig zu machen.

Insbesondere ein INSERT . Eine SELECT-Anweisung, die sich auf die Tabelle bezieht, in die eingefügt wird, fügt möglicherweise mehr Zeilen als erwartet ein, da der SELECT-Teil der Anweisung einige der neuen Zeilen beim Einfügen sieht und sie erneut verarbeitet.

Die LOAD DATA-Anweisung, die die Manipulation von HDFS-Datendateien beinhaltet, gilt nicht für Kudu-Tabellen.

Ab Impala 2.9 fügen die INSERT- oder UPSERT-Operationen in Kudu-Tabellen automatisch einen Austausch- und einen Sortierknoten zum Plan hinzu, der die Zeilen gemäß dem Partitionierungs-/Primärschlüsselschema der Zieltabelle partitioniert und sortiert (es sei denn, die Anzahl der Zeilen soll eingefügt ist klein genug, um die Ausführung eines einzelnen Knotens auszulösen). Da Kudu Zeilen beim Schreiben partitioniert und sortiert, entlastet die Vorpartitionierung und Sortierung Kudu und hilft großen INSERT-Vorgängen, ohne Zeitüberschreitung abzuschließen. Dieses Standardverhalten kann jedoch die End-to-End-Leistung der INSERT- oder UPSERT-Operationen verlangsamen. Ab Impala 2.10 können Sie die Hinweise /* +NOCLUSTERED */ und /* +NOSHUFFLE */ zusammen verwenden, um die Partitionierung und Sortierung zu deaktivieren, bevor die Zeilen an Kudu gesendet werden. Da das Sortieren viel Arbeitsspeicher verbrauchen kann, sollten Sie außerdem in Erwägung ziehen, die Abfrageoption MEM_LIMIT für diese Abfragen festzulegen.


Was mir sofort aufgefallen ist, ist folgendes:

Ihr Design geht davon aus, dass jeder Schüler genau 1 Mutter und genau 1 Vater hat. Ich kann Ihnen jetzt sagen, dass das nicht der Fall sein wird. Studierende mit geschiedenen Eltern haben möglicherweise zwei Mütter und zwei Väter, die alle ihre Kontaktdaten aufgelistet haben möchten. Einige Schüler haben möglicherweise schwule oder lesbische Eltern und somit zwei Väter oder zwei Mütter. Einige Schüler haben möglicherweise weder, und kann stattdessen einen gesetzlichen Vormund haben, der weder ihr Vater noch ihre Mutter ist.

Eine Lösung hierfür wäre, eine Tabelle für eine "Person" zu erstellen und Personen mit jedem Schüler zu verknüpfen. Stellen Sie fest, ob es sich bei dieser Person um einen Vater oder eine Mutter (oder einen nicht elterlichen Vormund) handelt. Dies erleichtert auch das Geschwistern: Sie können für mehrere Schüler dieselbe Mutter, denselben Vater usw. haben.

Für die meisten Studenten ist dies kein Problem, aber für mehr als Sie vielleicht denken. Tun Sie diesen Familien und Ihrem Management einen Gefallen, indem Sie es einfach machen, verschiedene Familienszenarien zu bewältigen!

Einige Dinge, die herausgesprungen sind

Nehmen Sie Martin Yorks Vorschlag und seien Sie so konsistent wie möglich. Der Benutzer identifiziert Primärschlüsselnamen wie user_id im Gegensatz zu id für jede Tabelle, da dies für diejenigen, die die SQL schreiben/pflegen, weniger verwirrend ist. Für Fremdschlüssel würde ich Tabelle zuerst vorschlagen, z.B. area_id im Gegensatz zu IdArea, da es besser mit natürlicher Sprache fließt.

Wenn Sie sich Ihre ERD ansehen, gibt es Stellen, an denen es nicht zu 3NF kommt (dies ist ein Niveau der Datenbanknormalisierung, das Sie nach Möglichkeit anstreben sollten).

Verwenden Sie die richtigen Feldtypen, es sieht so aus, als würden Sie häufig Zeichenfolgen verwenden, Dinge wie das Einstellungsdatum sollten der tatsächliche Zeitstempel / die Datums-/Uhrzeitspalte sein, das Geschlecht kann eine Aufzählung sein usw.

Alle Kontakt-/Telefoninformationen in den Personal- und Studententabellen können in geeigneteren Telefon-/Kontakttabellen platziert werden, da dies eine zu vielen Beziehungen sind.

Ihre Anwesenheitstabelle. Es sieht so aus, als ob es entweder besagt, dass ein Schüler an einem bestimmten Tag die Schule besucht hat oder nicht. Es scheint, dass dies etwas mehr auf Klassenebene wäre, da ein Schüler einen halben Tag und dergleichen besuchen könnte.

Ist es möglich, dass ein Mitarbeiter mehr als einen Mitarbeitertyp hat, wenn ja, sollten Sie eine assoziative Tabelle haben, um Mitarbeiter mit Mitarbeitertypen zu verknüpfen?

Anstelle von Dienstjahren im Personal, könnten Sie dies nicht einfach anhand der Spalte Datum der Einstellung herausfinden, anstatt jedes Jahr die Spalte Dienstjahr zu aktualisieren.

Das sind einige Dinge, die mir aufgefallen sind, hoffe es hilft.

Alle Ihre IDs (eindeutige IDs) werden ID genannt (das ist in Ordnung und funktioniert für Sie)
Aber ich habe festgestellt, dass dies schwer zu lesen sein kann, wenn Sie anfangen, Joins zu machen. Daher benenne ich den eindeutigen Schlüssel gerne nach der Tabelle. zB User_ID auf der User Table etc.

Um die Bezeichner leichter lesbar zu machen, verwenden Sie entweder die Groß-/Kleinschreibung oder trennen Sie die Wörter mit _
Identifikatoren wie IDArea laufen ein bisschen viel zusammen. Also IdArea oder ID_Area oder Id_Area (Denken Sie daran, einen Stil auszuwählen und seien Sie jedoch konsistent).

Die Staff-Tabelle enthält viele Informationen, von denen viele NULL sein können.
Ich hätte lieber eine Personentabelle, um Personeninformationen zu speichern. Dann eine Beziehungstabelle, um Beziehungen zwischen Personen zu speichern. Auf diese Weise können Sie, wenn Ihre Datenbank erweitert wird (und in einer geschäftlichen Umgebung wird dies passieren), andere Beziehungen zwischen den Mitarbeitern ausdrücken.

Bezogen auf Mitarbeiter. Wie Mitarbeiter würde ich die persönlichen Daten des Schülers in der Personentabelle speichern. Hinweis.Ich würde immer noch eine separate Tabelle (oder Ansicht) für Mitarbeiter/Studenten behalten, die einen Link zur Personentabelle hat.

Ich stimme allen obigen Beobachtungen der anderen zu, aber ich werde auf einige besondere Punkte eingehen:

Sie könnten auf jeden Fall eine zusätzliche Normalisierung vornehmen. Es gibt Stellen, an denen dies auf eine bewusste Entscheidung zurückzuführen ist, NICHT vollständig zu normalisieren (es kann einige Gründe geben, dies nicht zu tun ... abhängig von Ihrem Problembereich), aber insgesamt, wenn ich beginne, dieselben Feldnamen in mehreren Tabellen zu sehen (außer PK/FK-Beziehungen) werde ich misstrauisch. Ein Beispiel (das Martin York anspricht, aber ich gehe noch einen Schritt weiter) sind alle "Menschen"-Felder. Beachten Sie die Doppelarbeit zwischen der Tabelle „Mitarbeiter“ und der Tabelle „Schüler“ in Bezug auf Mütter/Väter/Arbeitsplätze/Berufe. Mütter und Väter sind Menschen. Mitarbeiter sind auch Menschen. Studenten sind Menschen.

Mir ist aufgefallen, dass Sie in Ihrer Schülertabelle ein Feld "Beobachtungen" haben. Ich empfehle Ihnen dringend, eine Tabelle "Beobachtungen" mit einem Fremdschlüssel zur Tabelle "Studenten" mit den folgenden Feldern zu definieren (Die Staff_ID soll aufzeichnen, wer die Beobachtung gemacht hat). Im Laufe der Zeit werden sich Beobachtungen ansammeln, und es wird hilfreich sein zu wissen, wann und von wem sie gemacht wurden:

Beobachtungstabelle: Beobachtung_ID, Schüler_ID, Beobachtung_Datum, Beobachtung, Mitarbeiter_ID

Ich stimme der Vorstellung zu, dass es eine separate "Contact_Info"-Tabelle geben sollte. Außerdem wette ich, dass Sie dem Schüler (oder den Eltern des Schülers) von Zeit zu Zeit Post schicken möchten. Ich würde zu diesem Zweck eine Tabelle "Adressen" einfügen. Ich will nicht vorgeben, zu wissen, wie es in Bolivien funktioniert, aber in den Vereinigten Staaten verschicken Schulen gerne Zeugnisse (obwohl Eltern heutzutage AUCH über das Internet die Fortschritte ihrer Schüler verfolgen können. ).

Die Gehälter der Mitarbeiter können sich ändern. Obwohl Sie entscheiden können, dass es akzeptabel ist, diesen Wert zu überschreiben, ist dies ein weiterer Bereich, in dem eine korrekte Normalisierung eine Tabelle Mitarbeiter-Gehälter anzeigt, die Felder für ID, Gehalt und Effektivdatum enthält.

Wie weit Sie den Normalisierungsprozess bringen, kann schwierig sein, aber wie einer oder mehrere der anderen Kommentatoren bemerkt haben, sollten Sie immer auf 3NF schießen. Ich verspreche Ihnen aus eigener schmerzlicher Erfahrung, dass Sie froh sein werden, wenn Ihr Chef beschließt, einen Bericht über die Gehaltserhöhungen der Mitarbeiter über einen Zeitraum von fünf Jahren zu erhalten.

Obwohl es oft eine bewusste, designbasierte Entscheidung gibt, eine Tabelle zu "denormalisieren", sollte die Entscheidung für diejenigen dokumentiert werden, die Ihre Datenbank in Zukunft pflegen müssen, wenn Sie nicht mehr dort sind.


2 Antworten 2

Um die Frage direkt zu beantworten, gibt es zwei Möglichkeiten, die Operation auszuführen.

  • Wenn die Anzahl der in der Tabelle beteiligten varchar-Spalten klein ist (ein oder zwei), ist es praktischer, Pseudo-Temp-Spalten zu erstellen
  • Wenn die Anzahl der varchar-Spalten größer ist, ist der obige Weg nicht sehr praktisch - Sie erstellen also eine Pseudotabelle. Dies wird am häufigsten bei Metadatenaktualisierungsskripten einiger Datenbanktools wie ErWin oder ER/Studio verwendet (ich habe beide Tools verwendet und die generierten Skripte vor der Anwendung überprüft).

Hinweis zu großen Tischen: Wenn die Tabelle einige Tausend Datensätze oder weniger enthält, können Sie die Operation gleichzeitig ausführen. Im Fall von Tabellen mit Millionen Datensätzen ist es praktischer, in Batches auszuführen (sagen wir jedes Mal Tausende oder Hunderte von Datensätzen).

Pseudo-Temp-Spalten (ich habe vergessen, wenn es einen anderen, passenderen Namen gibt) sind Spalten, die zum Speichern des Ergebnisses einer Konvertierung verwendet werden. In diesem Fall wären sie auch die letzten Spalten nach dem Prozess.

  1. Erstellen Sie die neuen Spalten mit der vorgesehenen Länge. Vergessen Sie nicht, alle Check-Constraints oder Standardwerte in die neue Definition aufzunehmen
  2. Führen Sie ein Update (oder Updates, siehe obige Beobachtung) durch, um die Daten der alten Spalte in der neuen zu speichern.
  3. Führen Sie die Protokollsicherung und den Checkpoint durch, damit das Protokoll nicht absurd groß wird.
  4. Wenn mit der alten Spalte Einschränkungen verbunden sind, löschen Sie diese.
  5. Lassen Sie die alte Spalte fallen.
  6. Benennen Sie die neue Spalte in den alten Spaltennamen um
  7. Erstellen Sie die betroffenen Indizes neu (oder alle, wenn die betroffene Spalte auch Teil einer geclusterten Primärschlüsseleinschränkung war - es ist selten, dass jemand einen (n)varchar als PK verwendet, aber ich habe einige gesehen).

Dies ist der gleiche Prozess, der in Aarons Antwort beschrieben wird.

Wenn die Änderung mehr als eine Handvoll Spalten umfasst, ist es praktischer, eine neue Tabelle basierend auf dem Schema der alten zu erstellen.

  1. Erstellen Sie eine neue Tabelle ohne Tabelleneinschränkungen (PK,FK usw.). Bringen Sie zu diesem Zeitpunkt nur Spalten-Einsen (NOT NULL, DEFAULT, CHECK usw.)
  2. Fügen Sie die Daten der alten Tabelle in die neue Tabelle ein (siehe die Hinweis zu großen Tischen über). SET IDENTITY_INSERT hier ist ein Muss.
  3. Löschen Sie nun alle Tabellenbeschränkungen (PK, FKs, Checks) und Trigger für die alte Tabelle. Erstellen Sie diese Einschränkungen und Trigger für die neue Tabelle neu.
  4. Erstellen Sie alle anderen Indizes (je nach Wartungsfenster alle auf einmal oder einzeln) der alten Tabelle in der neuen Tabelle neu. Sofern die Tabelle keinen Clustered-Index hat, muss dies nach Schritt 3 erfolgen. Oder zumindest nach der Erstellung der PK-Einschränkung.
  5. Überprüfen Sie, ob alles richtig gelaufen ist (wenn Sie dabei keinen Trigger oder eine Einschränkung vergessen haben) und wenn alles in Ordnung ist, löschen Sie die alte Tabelle.
  6. Benennen Sie die neue Tabelle in den Namen der alten Tabelle um

Hinweis zu Schritt 4: Wenn Sie doppelte Indizes entdeckt haben (das Auffinden doppelter Indizes ist ein sehr langes Thema, siehe Kimberly Tripps Blog auf SQLSkills.com), ist dies Ihre Chance, sie zu entfernen, wenn dies der Fall ist.

Der Wechsel von VARCHAR zu NVARCHAR hat einige Auswirkungen auf die Leistung, zumindest für jeden SQL Server unter 2008R2. Für SQL 2008 R2 hat Aaron Bertrand einige Blog-Posts zur Unicode-Komprimierungsfunktion, die ein Gegengewicht bilden kann, wenn NVarchar-Spalten zum Speichern von Inhalten verwendet werden, die in VARCHAR-Spalten gespeichert werden können. Ich habe sie nicht vollständig gelesen, wie es die Artikel verdienen, aber das Thema ist interessant.

NVARCHAR-Spalten speichern normalerweise (IOW, vor 2008R2) alle Zeichen in den Spalten mit 2 Byte pro Zeichen. Beispielsweise wird die Zeichenfolge 'MSSQL' in 5 Bytes in einer VARCHAR-Spalte und in 10 Bytes in einer NVARCHAR-Spalte gespeichert. Da Nicht-LOB-String-Spalten darauf beschränkt sind, maximal 8000 . zu speichern Bytes, bedeutet dies, dass VARCHAR 8000 Zeichen speichern kann, während NVARCHR auf 4000 begrenzt ist.

Implikationen dieser Tatsachen:

  • Da Indexschlüssel auf 900 Byte begrenzt sind (siehe Dokumentation zu CREATE INDEX), schlägt der Befehl nicht fehl, wenn Sie versuchen, eine NVARCHAR(500)-Spalte zu indizieren (wenn dies die einzige Spalte im Indexschlüssel ist), aber wenn Sie UPDATE oder INSERT eine Zeile mit mehr als 450 - (Gesamtgröße der anderen Spalten auf dem Indexschlüssel, falls zutreffend) Zeichen wird der Vorgang fehlschlagen.
  • Je mehr Bytes zu bedienen sind, desto mehr Arbeit ist zu erledigen. Sie lesen/schreiben/vergleichen/cachen das Doppelte von Bytes.
  • Je nachdem, wie massiv die Tabelle ist, den Einfluss der Stringspalten auf die gespeicherte Größe der Tabelle und wie die Beteiligung der Tabelle an der Datenbankgröße, können Sie mit einem Anstieg der (verwendeten) Datenbankgröße und aller davon beeinflussten Variablen rechnen direkt oder nicht (wie Sicherungs-/Wiederherstellungszeit, Indexpflege usw.).

BEARBEITEN: Wie von gbn angegeben, lohnt es sich nicht, etwas zu erstellen, nur um VARCHARs zu verwenden, wenn Sie eine klare Anforderung haben, die NVARCHAR-Spalten erfüllen muss.


3 Antworten 3

Wie Doug sagt, habe ich angefangen, mich damit zu befassen, und bin mit einem größeren Test/Demo/etc. als ich ursprünglich geplant hatte. Ich habe den Klassenansatz "Wrapper" gewählt, beginnend mit einer AuraEnabled-Version von FieldSetMember in FieldSetMember.apx:

Dies wird in FieldSetController.apxc verwendet, die Dinge wie a) die Namen von Objekttypen mit Feldsätzen abrufen und b) die Felder für den Feldsatz als Liste von FieldSetMember abrufen können:

Der Controller wird in fsTest.cmp verwendet

Der zugehörige Controller fsTesdtController.js verarbeitet hauptsächlich Ereignisse:

Der Helfer fsTestHelper.js erstellt die Benutzeroberfläche, um die Objekte mit Feldsätzen, den Feldsätzen für das ausgewählte Objekt, einem generierten Formular und einem Testbereich anzuzeigen, um die Datenbindung zu demonstrieren:

Und ein bisschen CSS, um es in fsTest.css etwas schöner zu machen:

Die Komponente implementiert force:appHostable, sodass sie in der S1 Mobile App verwendet werden kann. Um es eigenständig zu verwenden, hier ist fsTestApp.app:

Bei der Ausführung sieht die Benutzeroberfläche wie folgt aus:

Um es zu verwenden, klicken Sie oben links auf das Symbol zum Aktualisieren/Neuladen. Dies kann einige Sekunden dauern, da die Anzahl der Objekte in einer typischen Organisation enorm ist. Wenn Sie keine Feldsätze haben, sehen Sie nichts in der Liste. Wenn Sie dies tun, werden alle Objekttypen mit Feldsätzen aufgelistet. Durch Klicken auf den Link für den Objekttyp werden die Feldsätze vom Server geholt und in der Liste oben rechts angezeigt. Wenn Sie auf einen Feldsatz-Link klicken, wird das Formular und die Testliste generiert. Geben Sie Werte ein, und drücken Sie die Tabulatortaste / Drücken Sie die Eingabetaste, um die Änderung der Werte anzuzeigen. Klicken Sie auf die Schaltfläche Test senden, um die Werte anzuzeigen.

Beachten Sie, dass in ui:inputDate ein Fehler vorliegt, der auftreten kann, wenn die dynamische Erstellung verwendet wird. Sie erhalten einen Spinner und werden blockiert.

Sie können die DisplayType->Komponenten-Zuordnung in der configMap in fsTestHelper.js ändern. Sie können das Mapping auch anders durchführen, über Code, Metadaten usw., falls gewünscht.

Lassen Sie es mich wissen, wenn Sie Fragen haben. Es ist keine robuste App, aber sie könnte einige Ideen liefern, wie man dies angehen kann.


Schau das Video: QGIS - how to extract attributes from one layer to another (Oktober 2021).