Ich schreibe meine erste Anwendung für Android und werde die SQLite-Datenbank verwenden, um die Größe so weit wie möglich zu begrenzen. Ich denke jedoch, dass die Frage im Allgemeinen für das Datenbankdesign gilt.
Ich plane, Datensätze mit Text und Erstellungsdatum zu speichern. Die App ist eine eigenständige App, dh, sie wird nicht mit dem Internet verbunden und nur von einem Benutzer aktualisiert. Es besteht also keine Chance, dass mehr als ein Eintrag zu einem bestimmten Datum vorhanden ist.
Benötigt meine Tabelle noch eine ID-Spalte? Wenn ja, welche Vorteile bietet die Verwendung der ID als Datensatzkennung gegenüber dem Datum?
Antworten:
IMHO wird die Verwendung einer Datumsspalte als Primärschlüssel am besten vermieden.
Ich habe an Systemen gearbeitet, in denen ein Datumsfeld als Primärschlüssel verwendet wird. Wenn Sie mit Datumsfeldern arbeiten, ist das Schreiben von Abfragen zum Zurückziehen von Teilmengen der Daten ein Kinderspiel.
Einige andere Punkte, die Sie möglicherweise berücksichtigen möchten:
Sie denken vielleicht, dass ein Zeitpunkt eindeutig ist, aber das hängt eher von der Granularität der Datumsspalte ab. Sind es Minuten, Sekunden, Millisekunden usw. Können Sie absolut sicher sein, dass Sie niemals eine Verletzung des Primärschlüssels bekommen?
Wenn Sie die Datenbank auf eine andere Plattform migrieren möchten, treten möglicherweise erneut Probleme auf, wenn die Granularität der Datumsdaten zwischen den Plattformen unterschiedlich ist.
Sie müssen natürlich das Ideal mit dem abwägen, mit dem Sie arbeiten müssen. Wenn der Platz wirklich so wichtig ist, kann die Verwendung der Datumsspalte das geringere von zwei Übeln sein. Das ist eine Designentscheidung, die Sie treffen müssen.
Bearbeiten:
Ich möchte darauf hinweisen, dass dies in keiner Weise darauf hindeutet, dass es sich um eine schlechte Entwurfsentscheidung handelt. Nur, dass es Probleme mit der Praktikabilität des betreffenden RDBMS geben könnte.
quelle
Nein, Sie müssen keine ID-Spalte in Ihrem Schema definieren, wenn Sie garantieren können, dass es niemals ein doppeltes Datum gibt.
ABER ...
... das heißt, Sie können es genauso gut verwenden. Das kleine Geheimnis dabei ist, dass SQLite bereits eine eindeutige, automatisch inkrementierende ID für jede Tabelle mit dem Namen ROWID hat. Wenn Sie eine automatisch inkrementierende Ganzzahlspalte in Ihrer Tabelle als PK deklarieren, wird von SQLite keine neue Spalte erstellt, sondern lediglich die vorhandene ROWID-Spalte aliasisiert.
http://www.sqlite.org/autoinc.html
Sie sparen also keinen Platz, wenn Sie keine ID-Spalte verwenden, da Sie eine pro Tabelle erhalten, ob Sie dies möchten oder nicht!
quelle
Verwenden Sie ein ID-Feld, wenn eine der folgenden Aussagen zutrifft:
Lesen Sie diese Frage: Gibt es eine kanonische Quelle, die "All-Surrogate" unterstützt?
Bearbeiten:
Da meiner Meinung nach , so scheint es , keine der oben genannten gilt, nicht wahr müssen zu verwenden und ID - Feld, aber Sie können ein , wenn Sie möchten.
quelle
Denken Sie daran, dass Sie möglicherweise auch die Bedeutung der Spalte "Datum" von
created_at
nachupdated_at
oder jede andere Änderung in dieser Richtung ändern möchten , was meiner Meinung nach ein sehr häufiger Fall ist.In einigen Fällen können Sie durch Hinzufügen einer ID-Spalte flexibler werden, wenn sich Ihr Design ändert.
quelle