MySQL Datenbank Design Standard
Übersicht
- Globale-Regeln
- Datenbank (Database)
- Tabelle
- Table-Constraint
- Feld / Spalte (Column)
- Schlüssel und Index (Key and Index)
- Beziehungen (Relationship)
- Physische Speicherung
- View
- Anhang
1. Globale Regeln
- Wenn derselbe Name in mehreren Schemata existiert, muss er die gleiche Sache, die gleiche Sicht auf Daten repräsentieren oder Daten auf die gleiche Weise manipulieren.
- Datenbankobjektregeln haben Vorrang vor globalen Regeln, wenn es Überschneidungen gibt oder wenn die globale Regel für das Datenobjekt angepasst wird.
- Insbesondere gelten folgende Normalisierungsregeln:
- Erste Normalform
- Eliminierung von Wiederholungsinformationen
- Erstellen separater Tabellen für relationale Daten (Stichwort "Relationstabelle")
- Verwende Primärschlüssel, um jeden Datensatz zu identifizieren.
- Zweite Normalform
- Erstelle separate Tabellen für jeden Satz von Bezugsdaten. Hier werden viele-zu-viele Beziehungen normalisiert.
- Verwenden von Fremdschlüsseln zur Verknüpfung von Bezugstabellen
- Dritte Normalform
- Eliminieren von Feldern, die sich nicht auf den Primärschlüssel beziehen
- Erste Normalform
2. Datenbank (Database)
- Benamung
- Englisch
- Kleinschreibung
- CamelCase
- Allein zulässige Zeichen sind: a) Buchstaben
a-z A-Z
, b) Zahlen0-9
, c) Unterstrich_
- Jedes generierte Schema innerhalb einer Datenbank muss mindestens eine Tabelle enthalten.
3. Tabelle (Table)
- Benamung
- Englisch
- Kleinschreibung
- CamelCase
- Allein zulässige Zeichen sind: a) Buchstaben
a-z A-Z
, b) Zahlen0-9
, c) Unterstrich_
- Die Schlüsselvereinheitlichung darf nicht in einem physischen Schema erfolgen und muss spätestens im physischen Entwurfsschritt des Datenbankdesigns aufgelöst werden.
- Alle Tabellen müssen mindestens eine Spalte haben.
- Allen Tabellen müssen geschätzte volumetrische Informationen zugeordnet werden, die für das erste Jahr der Verwendung gelten.
- Alle Tabellen müssen Primärschlüsselspalten enthalten.
- Alle Tabellen müssen je eine Erstellungs- und eine und Änderungs-Zeitstempel-Spalte aufweisen (siehe 5. Felder / Spalten (Column)).
4. Table Constraint
- Constraints müssen die SQL-Syntax verwenden, wie sie durch die ANSI SQL92 oder neuere Standards definiert ist.
Keine Implementierung von Ver- oder Entschlüsselung auf Spaltenebene. (s. "Datenbankinhalte AES verschlüsseln mit MySQL")
5. Feld / Spalte (Column)
-
Benamung
- Englisch
- Kleinschreibung
- CamelCase
- Allein zulässige Zeichen sind: a) Buchstaben
a-z A-Z
, b) Zahlen0-9
, c) Unterstrich_
-
Jeder Spaltendatentyp muss aus der autorisierten Liste der berechtigten Datentypen ausgewählt werden.
-
Keine Verwendung aller möglichen Datentypen der Datenbankplattform. Die Beschränkung auf autorisierte Datentypen ermöglicht eine konsistente Implementierung und langfristige Performance-Vorteile.
-
Jeder Datentyp einer Fremdschlüsselspalte (Kind-Spalte) muss mit dem Datentyp der beitragenden Spalte (Eltern-Spalte) übereinstimmen (Parent/Child Verhältnis).
-
Tabellenspalten dürfen nicht als IDENTITY-Spalten definiert werden.
-
Namen dürfen nur den Spaltenbeschränkungen zugewiesen werden, die für Spalten definiert sind, für die Anwendungsregeln ein bestimmtes Verhalten oder bestimmte Werte vorschreiben.
-
Jede Spalte muss die gleiche Datentypdefinition für alle Vorkommen der Spalte in der Datenbank haben.
-
Spalten müssen in der folgenden Reihenfolge angeordnet sein, um die Effizienz der Datenbankprotokollierung zu gewährleisten:
- Primärschlüsselspalten
- Häufig geänderte Werte
- Selten geänderte Werte
- Sehr große Spalten, bspw.
VARCHAR(2000)
- Änderungs-Zeitstempel
- Erstellungs-Zeitstempel
-
Standard Bezeichner: siehe A) Liste der berechtigten Datentypen
-
Nicht zulässige Bezeichner: siehe Keywords and Reserved Words
-
Pflichtfelder/-spalten
-
id
Typ Kollation Attribute Null Standard Extra int(11) UNSIGNED Nein AUTO_INCREMENT -
changeStamp
Typ Kollation Attribute Null Standard Extra timestamp on update CURRENT_TIMESTAMP Nein CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -
createStamp
Typ Kollation Attribute Null Standard Extra datetime Nein 0000-00-00 00:00:00
-
-
SQL Beispiel-Tabelle
-- -- Tabellenstruktur für Tabelle `dbDesignStandard` -- CREATE TABLE IF NOT EXISTS `dbDesignStandard` ( `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `amount` decimal(15,0) NOT NULL, `area` decimal(7,0) NOT NULL, `bitwise` blob NOT NULL, `circumference` decimal(7,0) NOT NULL, `code` char(8) COLLATE utf8_bin NOT NULL, `comment` varchar(255) COLLATE utf8_bin NOT NULL, `count` int(11) NOT NULL, `dateA` date NOT NULL, `changeStamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createStamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='DbDesignStandard'; -- -- Daten für Tabelle `dbDesignStandard` -- INSERT INTO `dbDesignStandard` (`id`, `amount`, `area`, `bitwise`, `circmference`, `code`, `comment`, `count`, `dateA`, `changeStamp`, `createStamp`) VALUES (1, '999999999999999', '9999999', '', '9999999', 'ABCDEFGH', 'Foo sagt: "Schau Bar - Dies ist ein Kommentar."', 2147483647, '0000-00-00', '2018-01-26 14:38:04', '0000-00-00 00:00:00');
6. Schlüssel und Index (Key and Index)
- Jeder Index muss mindestens eine Spalte enthalten.
- Jede Tabelle muss einen Primärschlüsselindex enthalten.
- Jede Tabelle muss eine Primärschlüsselbeschränkung enthalten (meint etwa Eindeutigkeitsbeschränkung, bspw. via Schlüsselwort UNIQUE durchsetzbar).
- Jeder Fremdschlüssel muss eine Fremdschlüsselbeschränkung enthalten.
- Überlappende Indizes dürfen nicht erzeugt werden.
- Die Spaltenreihenfolge der Primärschlüssel-Indexspalten muss mit der Reihenfolge der Spalten in der Tabelle übereinstimmen, aus denen der Primärschlüssel besteht.
- Die Reihenfolge der Fremdschlüsselspalten muss mit der Spaltenreihenfolge der Tabelle übereinstimmen, die den Fremdschlüssel beisteuert.
7. Beziehungen (Relationship)
- Jede identifizierende Beziehung darf keine Nullen in der/den untergeordneten Fremdschlüsselspalte(n) zulassen.
- Jede Beziehung muss gültige Eltern- und Kindtabellen haben.
- Viele-zu-Viele-Beziehungen sollen nicht entstehen.
- Jede Beziehung muss durchsetzbar sein.
8. Physische Speicherung
- Physische Speicherdateinamen und -zuweisungen werden von den zuständigen Fachabteilungen vergeben (Admins).
- Jedes physische Design muss mindestens zwei Speicherdateien enthalten:
- Primäre Standard-Dateigruppe, die verwendet wird, um alle implementierten physischen Objekte zu speichern.
- Datenbankprotokoll
- Die primäre Dateigruppe soll eine primäre Datendatei haben.
-
Unbedingt bevorzugter Zeichensatz/Kollation der Datenbank Engine: UTF-8.
-
Konfiguration von MySQL: Editieren der
my.cnf
-Datei, die sich normalerweise in/etc/my.cnf
oder/etc/mysql/my.cnf
befindet (Linux). Füge folgende Zeilen zu den entsprechenden Abschnitten hinzu:[client] loose-default-character-set = utf8 [mysql] loose-default-character-set = utf8 [mysqld] collation-server = utf8_unicode_ci loose-default-character-set = utf8 character-set-server = utf8 init-connect = 'SET NAMES utf8' skip-character-set-client-handshake
-
9. View
- Jeder View muss mindestens eine (1) Spalte enthalten, die aus einer Tabelle oder einem anderen View in der Datenbank abgerufen wird.
10. Anhang
A) Liste der berechtigten Datentypen
Bezeichner | Typ | Länge | Verwendung | Beispiel |
---|---|---|---|---|
id | INT | 11 | Primärschlüssel, ausschließlich | |
amount | DECIMAL | 15 | Geldwerte, Anzahl | |
area | DECIMAL | 7 | Umfang | |
bitwise | BIT | 0 | Binär | |
blobwise | BLOB | 0 | Binär | |
binwise | BINARY | 0 | Binär | |
circumference | DECIMAL | 7 | Umfang | |
code | CHAR | <=8 | ||
comment | VARCHAR | 255 | Kommentar | |
count | INT | 11 | ||
date* | DATE | 0 | Datum | dateA, dateB, dateEntry |
depth | DECIMAL | 7 | Tiefe, Grad | |
description | VARCHAR | 255 | Beschreibung | |
distance | DECIMAL | 7 | Entfernungsangabe | |
height | DECIMAL | 7 | Höhenangabe | |
identifier | CHAR | 8 | ||
length | DECIMAL | 7 | Längenangabe | |
name | VARCHAR | 255 | Bezeichner, Name, Wert | Tabelle ist "Company"; Feld "name" allein steht für Firmenname. Falsch wäre: "companyName" |
numerus | DECIMAL | 7 | Zahl | |
" | INT | 11 | Zahl | |
key | VARCHAR | 255 | Bezeichner, Schlüssel | |
value | VARCHAR | 255 | Wert | |
changeStamp | TIMESTAMP | 0 | Änderungs-Zeitstempel | |
createStamp | DATETIME | 0 | Erstellungs-Zeitstempel | 2018-05-01 |
*Stamp | TIMESTAMP | 0 | *-Zeitstempel | lastStamp, newStamp, joinedStamp |
Links
- "Data and Database Design Standards for SQL Server", fdot, 2016-02-04, http://www.fdot.gov/it/docs/standards/databasedesignstandards02042016.pdf
- "SQL-92", wikipedia, 2017-08-31, https://en.wikipedia.org/wiki/SQL-92
- "Normalisierung (Datenbank)", wikipedia, 2018-01-19, https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
- "Datenbankinhalte AES verschlüsseln mit MySQL", agile-coding.net, 2013-12-13, http://www.agile-coding.net/datenbankinhalte-aes-verschluesseln-mit-mysql/
- "Keywords and Reserved Words", MySQL, https://dev.mysql.com/doc/refman/5.7/en/keywords.html (Version 5.7)