2016-05-26 10 views
0

Ich fing an, eine Datenbank zu entwerfen, die Systemereignisse verfolgt, indem ich einigen on-line-Tutorien folge, und einige einfache Beispiele beginnen, indem sie automatisch inkrementierende IDs als Primärschlüssel zuweisen. Ich schaute auf meine Datenbank, ich brauche keine IDs. Von allen meinen Spalten sind der Zeitstempel und die Geräte-ID die zwei Spalten, die zusammen ein eindeutiges Ereignis identifizieren.Sollte ich meine zwei Spalten verwenden, die einen Datensatz eindeutig als Primärschlüssel identifizieren?

Was mein Programm gerade tut, ist einige Ereignisse aus dem Systemprotokoll in den letzten x Minuten zu ziehen und diese Ereignisse in die Datenbank einzufügen. Allerdings könnte ich zu sehr in die Vergangenheit gehen, dass sich die Ereignisse mit denen in der Datenbank überschneiden. Wie bereits erwähnt, sind Zeitstempel und Geräte-ID die zwei Felder, die ein Ereignis eindeutig identifizieren. Meine Frage ist, sollte ich diese beiden Felder als Primärschlüssel verwenden und ab sofort "Insert ignore" verwenden, damit ich doppelte Datensätze vermeiden kann?

+0

[Hier] (http://dba.stackexchange.com/questions/57548/how-to-set-up-multiple-fields-as-primary-key-in-mysql) ist, wie Sie dies tun können, und ich sehe nichts falsch mit Ihrem zusammengesetzten Primärschlüssel. –

Antwort

1

Es ist eine gute Praxis, Ihre Geschäftswerte nie als Primärschlüssel der Tabelle zu verwenden und immer synthetische, z. Autoincrement, Werte dafür. Sie werden Ihr Leben in Zukunft einfacher machen, wenn sich die Geschäftsanforderungen ändern.

Wir haben gerade mit genau dieser Situation zu kämpfen. Haben Sie eine Spalte mit Business-Werten als Primärschlüssel für 2 Jahre und jetzt schmerzhaft eine Autoincrement-Einführung.

+0

Wie lösen Sie doppelte Datensatzprobleme auf? Überprüfung der neuen Datensätze (Größe n) gegen alte Datensätze (Größe m) wird Laufzeit O (nm) haben ... –

+1

@ return0 Sie können immer noch einzigartige Einschränkung auf (Gerät, Zeitstempel) Paar – Nikem

+1

... und nur um zu erarbeiten Nikems Kommentar: MySQL implementiert eindeutige Einschränkungen als (B-Tree-) Indizes - genau wie Primärschlüssel -, also sind darin enthaltene Suchanfragen O (log m), und die Kosten für die Überprüfung aller neuen Datensätze wären daher O (n log m). – eggyal

0

Möglicherweise müssen Sie in Zukunft Fremdschlüssel aus anderen Tabellen verwenden, um einige Zeilen zwischen zwei Tabellen zu verknüpfen. Es ist einfacher mit einem einspaltigen Primärschlüssel.
Aber wenn Sie es jetzt nicht brauchen - keine Notwendigkeit, Spalte speziell für den Index zu erstellen. Die Tabelle kann in Zukunft geändert werden, um eine solche Spalte mit Autoinkrement hinzuzufügen und den Primärschlüssel dorthin zu verschieben.

+0

Es ist durchaus möglich, zusammengesetzte Fremdschlüssel zu haben (in der Tat kann MySQL zusammengesetzte Fremdschlüsselbeschränkungen erzwingen). – eggyal

+0

@eggyal, ja. Ich habe nur gesagt, dass der Fremdschlüssel um eine Spalte einfacher ist als der Mehrspaltenschlüssel. Sie müssen zwei, drei oder mehr Spalten in jeder Tabelle mit Fremdschlüssel duplizieren, wenn es sich um einen Verbund handelt. Und dies wird in Tabelle und Schlüsselpuffer viel mehr Größe benötigen. Eine spezielle Autoinkrementierungsschlüsselspalte kann verwendet werden, um dies zu vermeiden. – Andrew

Verwandte Themen