Heim  >  Artikel  >  Datenbank  >  Analysieren Sie Fremdschlüsseleinschränkungen in der MySQL-Datenbank

Analysieren Sie Fremdschlüsseleinschränkungen in der MySQL-Datenbank

巴扎黑
巴扎黑Original
2017-08-10 10:56:591375Durchsuche

[Einführung] Jeder, der eine datenbankgesteuerte kleine Webanwendung mit MySQL entwickelt hat, weiß, dass das Erstellen, Abrufen, Aktualisieren und Löschen von Tabellen in einer relationalen Datenbank relativ einfache Prozesse sind. Theoretisch, solange Sie die Verwendung der gängigsten SQL-Anweisungen beherrschen und sich mit den serverseitigen Skripten vertraut machen, die Sie verwenden möchten

Jeder, der eine kleine datenbankgesteuerte Webanwendung mit MySQL entwickelt hat, weiß das die Tabellen einer relationalen Datenbank. Das Erstellen, Abrufen, Aktualisieren und Löschen von Vorgängen sind relativ einfache Prozesse. Theoretisch reicht es aus, die verschiedenen Operationen durchzuführen, die für MySQL-Tabellen erforderlich sind, insbesondere wenn Sie das schnelle MyISAM verwenden, solange Sie die Verwendung der gängigsten SQL-Anweisungen beherrschen und mit der von Ihnen gewählten serverseitigen Skriptsprache vertraut sind Datenbank-Engine wann. Aber selbst in den einfachsten Fällen sind die Dinge komplizierter als wir denken. Nachfolgend verwenden wir zur Veranschaulichung ein typisches Beispiel. Angenommen, Sie betreiben eine Blog-Site, die Sie fast täglich aktualisieren, und auf der Website können Besucher Ihre Beiträge kommentieren.

In diesem Fall sollte unser Datenbankschema mindestens zwei MyISAM-Tabellen enthalten, eine zum Speichern Ihrer Blogbeiträge und die andere zum Verarbeiten von Besucherkommentaren. Offensichtlich besteht zwischen diesen beiden Tabellen eine Eins-zu-Viele-Beziehung, daher müssen wir in der zweiten Tabelle einen Fremdschlüssel definieren, damit die Integrität der Datenbank aufrechterhalten werden kann, wenn Datenzeilen aktualisiert oder gelöscht werden.

Bei einer Anwendung wie der oben genannten stellt die Aufrechterhaltung der Integrität der beiden Tabellen nicht nur eine große Herausforderung dar, sondern die größte Schwierigkeit besteht darin, dass wir ihre Integrität auf Anwendungsebene aufrechterhalten müssen. Dies ist der Ansatz, der während der Entwicklung für die meisten Webprojekte gewählt wird, die keine Verwendung von Transaktionen erfordern, da MyISAM-Tabellen eine hervorragende Leistung bieten.

Dies hat natürlich auch seinen Preis. Wie ich bereits sagte, muss die Anwendung die Integrität und Konsistenz der Datenbank wahren, was die Implementierung komplexerer Designlogiken erfordert Beziehungen zwischen verschiedenen Tabellen. Obwohl der Datenbankzugriff durch den Einsatz von Abstraktionsschichten und ORM-Modulen vereinfacht werden kann, wird mit zunehmender Anzahl der von einer Anwendung benötigten Datentabellen die für deren Verarbeitung erforderliche Logik zweifellos komplexer.

Gibt es also für MySQL eine Fremdschlüsselverarbeitungsmethode auf Datenbankebene, die uns dabei hilft, die Datenbankintegrität aufrechtzuerhalten? Behandeln Sie Fremdschlüsseleinschränkungen auf sehr einfache Weise. Mit dieser Funktion können wir bestimmte Aktionen auslösen, z. B. das Aktualisieren und Löschen bestimmter Datenzeilen in der Tabelle, um vordefinierte Beziehungen aufrechtzuerhalten.

Alles hat Vor- und Nachteile. Der Hauptnachteil der Verwendung von InnoDB-Tabellen besteht darin, dass sie langsamer sind als MyISAM, insbesondere bei großen Anwendungen, bei denen offensichtlich viele Tabellen abgefragt werden müssen. Glücklicherweise unterstützt die MyISAM-Tabelle in der neueren Version von MySQL auch Fremdschlüsseleinschränkungen.

In diesem Artikel wird erläutert, wie Sie Fremdschlüsseleinschränkungen auf InnoDB-Tabellen anwenden. Darüber hinaus verwenden wir eine einfache PHP-basierte abstrakte MySQL-Klasse, um den entsprechenden Beispielcode zu erstellen. Natürlich können Sie auch Ihre bevorzugte andere serverseitige Sprache verwenden. Jetzt beginnen wir mit der Einführung, wie man Fremdschlüsseleinschränkungen auf MySQL anwendet.

Wann sind Fremdschlüsseleinschränkungen zu verwenden

Um ehrlich zu sein, ist es bei der Verwendung einer InnoDB-Tabelle in MySQL nicht notwendig, einen Fremdschlüssel zu verwenden Um jedoch den Nutzen von Fremdschlüsseleinschränkungen in bestimmten Situationen zu verstehen, verwenden wir zur spezifischen Veranschaulichung den Code des zuvor erwähnten Beispiels. Es enthält zwei MyISAM-Tabellen, die zum Speichern von Blogbeiträgen und Kommentaren verwendet werden.

Beim Definieren des Datenbankschemas müssen wir eine Eins-zu-viele-Beziehung zwischen den beiden Tabellen herstellen. Die Methode besteht darin, einen Fremdschlüssel in der Tabelle zu erstellen, in der die Kommentare gespeichert werden, um die Datenzeilen zu trennen (. d. h. Kommentare) entspricht einem bestimmten Blog-Beitrag. Hier ist der grundlegende SQL-Code zum Erstellen einer Beispiel-MyISAM-Tabelle:

DROP TABLE IF EXISTS `test`.`blogs`;

CREATE TABLE `test`.`blogs` (

`id` INT(10) UNSIGNED AUTO_INCREMENT,

`title` TEXT,

`content` TEXT,

`author` VARCHAR(45) DEFAULT NULL ,

PRIROSE KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `test`.`comments`;

CREATE TABLE `test`.`comments` (

`id` INT(10) UNSIGNED AUTO_INCREMENT,

`blog_id` INT(10) UNSIGNED DEFAULT NULL,

`comment` TEXT,

`author` VARCHAR(45) DEFAULT NULL,

PRIROSE KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET= utf8;


Oben haben wir gerade zwei MyISAM-Tabellen definiert, die die Datenschicht der Blog-Anwendung bilden. Wie Sie sehen, heißt die erste Tabelle Blogs. Sie besteht aus einigen offensichtlichen Feldern, in denen die ID, der Titel und der Inhalt jedes Blog-Beitrags und schließlich der Autor gespeichert werden. Die zweite Tabelle mit dem Namen „Kommentare“ wird zum Speichern von Kommentaren zu jedem Blog-Beitrag verwendet. Sie verwendet die ID des Blog-Beitrags als Fremdschlüssel, um eine Eins-zu-Viele-Beziehung herzustellen.

Bisher war unsere Arbeit relativ einfach, da wir nur zwei einfache MyISAM-Tabellen erstellt haben. Als Nächstes möchten wir diese Tabellen mit einigen Datensätzen füllen, um weiter zu veranschaulichen, was in der anderen Tabelle geschehen soll, wenn ein Eintrag in der ersten Tabelle gelöscht wird.

Aktualisieren und pflegen Sie die Integrität der Datenbank

Im vorherigen Teil haben wir zwei MyISAM-Tabellen erstellt, die als Datenschicht der Blog-Anwendung dienen. Natürlich ist die obige Einführung immer noch sehr einfach und wir müssen sie weiter diskutieren. Dazu füllen wir diese Tabellen mit einigen Datensätzen, indem wir einen SQL-Befehl wie folgt verwenden:

INSERT INTO blogs (id, title, content, author) VALUES (NULL,'Titel des ersten Blogeintrags') , 'Inhalt des ersten Blogeintrags', 'Ian')

INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, 1, 'Kommentieren des ersten Blogeintrags', 'Susan Norton') , (NULL, 1, 'Kommentieren des ersten Blogeintrags', 'Rose Wilson')

Der obige Code simuliert tatsächlich die Kommentare der Leser Susan und Rose zu unserem ersten Blogeintrag. Angenommen, wir möchten jetzt den ersten Blog mit einem weiteren Beitrag aktualisieren. Natürlich ist diese Situation möglich.

Um die Konsistenz der Datenbank aufrechtzuerhalten, muss in diesem Fall auch die Kommentartabelle entsprechend aktualisiert werden, entweder manuell oder durch eine Anwendung, die die Datenschicht verarbeitet. In diesem Beispiel verwenden wir SQL-Befehle, um die Aktualisierung abzuschließen, wie unten gezeigt:

UPDATE blogs SET id = 2, title = "Titel des ersten Blogeintrags", content = 'Inhalt des ersten Blogs Eintrag', Autor = 'John Doe' WHERE id = 1

Kommentare aktualisieren SET blog_id = 2 WHERE blod_id = 1

Wie bereits erwähnt, weil der erste Blog Der Inhalt des Da das Datenelement aktualisiert wurde, muss die Kommentartabelle diese Änderung ebenfalls widerspiegeln. In Wirklichkeit sollte dieser Aktualisierungsvorgang natürlich auf der Anwendungsebene und nicht manuell durchgeführt werden, was bedeutet, dass diese Logik mithilfe einer serverseitigen Sprache implementiert werden muss.

Um diesen Vorgang abzuschließen, kann PHP einen einfachen Unterprozess durchlaufen. Wenn jedoch Fremdschlüsseleinschränkungen verwendet werden, ist der Aktualisierungsvorgang der Kommentartabelle tatsächlich vollständig möglich an die Datenbank delegiert werden.

Wie bereits im Artikel erwähnt, bieten InnoDB-MySQL-Tabellen nahtlose Unterstützung für diese Funktion. Daher werden wir im späteren Teil Fremdschlüsseleinschränkungen verwenden, um den vorherigen Beispielcode neu zu erstellen.

 Kaskadenaktualisierung der Datenbank

  Im Folgenden werden wir den vorherigen Beispielcode mithilfe von Fremdschlüsseleinschränkungen und InnoDB-Tabellen (anstelle des Standardtyps MyISAM) umstrukturieren. Definieren Sie dazu zunächst die beiden Beispieltabellen neu, damit sie eine bestimmte Datenbank-Engine verwenden können. Dazu können Sie SQL-Code wie diesen verwenden:

DROP TABLE IF EXISTS `test`.`blogs`;

CREATE TABLE `test`.`blogs` (

`id` INT(10) UNSIGNED AUTO_INCREMENT,

`title` TEXT,

`content` TEXT,

`author` VARCHAR(45) DEFAULT NULL,

PRIROSE KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `test`.`comments`;

CREATE TABLE `test`.`comments` (

`id` INT(10) UNSIGNED AUTO_INCREMENT,

`blog_id` INT(10) UNSIGNED DEFAULT NULL,

`comment` TEXT,

`author` VARCHAR(45) DEFAULT NULL,

PRIROSE KEY (`id`),

KEY `blog_ind` ( `blog_id`),

CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8

Ein offensichtlicher Unterschied zwischen dem Code hier und dem vorherigen Code besteht darin, dass die beiden Tabellen jetzt die InnoDB-Speicher-Engine verwenden, sodass sie Fremdschlüsseleinschränkungen unterstützen können. Darüber hinaus müssen wir auch auf den Code achten, der die Kommentartabelle definiert:

CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON UPDATE CASCADE

Tatsächlich benachrichtigt diese Anweisung MySQLMySQL, dass bei der Aktualisierung der Blogs-Tabelle auch der Wert des Fremdschlüssels blog_id in der Kommentartabelle aktualisiert werden sollte. Mit anderen Worten

Hier wird MySQL die Datenbankintegrität kaskadierend aufrechterhalten, was bedeutet, dass bei der Aktualisierung eines Blogs auch die damit verbundenen Kommentare diese Änderung sofort widerspiegeln müssen, was wichtig ist. Wichtig ist, dass die Implementierung dieser Funktion nicht auf der Anwendungsebene abgeschlossen ist.

Die beiden MySQL-Beispieltabellen wurden nun definiert. Das Aktualisieren dieser beiden Tabellen ist nun so einfach wie das Ausführen einer UPDATE-Anweisung, wie unten gezeigt:

 "UPDATE blogs SET id = 2, title = "Titel des ersten Blogeintrags", content = 'Inhalt des ersten Blogeintrags', Autor = 'John Doe' WHERE id = 1"

Wie bereits erwähnt, müssen wir die Kommentartabelle nicht aktualisieren, da MySQL alles automatisch verarbeitet. Darüber hinaus können Sie MySQL veranlassen, nichts zu unternehmen, wenn versucht wird, eine Zeile in der Tabelle „Blogs“ zu aktualisieren, indem Sie den „ON UPDATE“-Teil der Abfrage entfernen oder „NO ACTION“ und „RESTRICT“ angeben. Natürlich können Sie MySQL auch andere Dinge erledigen lassen, die in späteren Artikeln vorgestellt werden.

Durch die obige Einführung hat meiner Meinung nach jeder ein klares Verständnis dafür, wie Fremdschlüsseleinschränkungen in Verbindung mit InnoDB-Tabellen in MySQL verwendet werden. Natürlich können Sie den kommenden Code auch weiter schreiben um Ihr Verständnis dieser praktischen Datenbankfunktion weiterzuentwickeln.

Das obige ist der detaillierte Inhalt vonAnalysieren Sie Fremdschlüsseleinschränkungen in der MySQL-Datenbank. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn