Ich möchte eine einfache Datenbank erstellen, die Knoten, ihre Funktionalitäten und Adresse speichern müssen, um im Falle von Problemen zu benachrichtigen. Anfangs dachte ich auf eine einfache SQL-Datenbank:Redis vs MySQL für einfache Datenbank
CREATE TABLE IF NOT EXISTS push_notifications (
node text NOT NULL,
functionality text NOT NULL,
address text NOT NULL,
);
wo Knoten und Funktionalitäten können viele Adresse, N auf N. Auf diese Weise, die Adresse zu bekommen Ich werde diese beiden Sätze nur ausführen:
SELECT address from push_notifications where node=XX and functionality=YY;
SELECT node, functionality from push_notifications where address=XX ORDER BY node, functionality;
jedoch nach ein wenig zu lesen, habe ich mehrere Zweifel an:
- Ist das für eine Datenbank ok, die zunächst nicht mehr als 10000 Einträge haben?
- Sollte ich die Normalisierung der Tabellenorganisation verwenden, dh eine für Knoten, eine andere für Funktionalitäten und eine andere für Adressen und die Verwendung von JOIN in SELECT? Wie könnte ich dann automatisch die Einträge aus den Tabellen löschen, die nicht mehr verknüpft sind, dh ein Knoten, der keine Funktionalität und keinen Endpunkt hat?
- Sollte ich zum Beispiel eine einfache Datenbank-Engine wie Redis verwenden, Schlüssel auf Node-Funktionalität (String und Wert eine Liste von Adressen) und einen anderen Satz von Schlüsseln zu den Endpunkten (Hash)?
Ich möchte hinzufügen, dass ich Java verwenden werde, um den Zugriff auf Daten zu behandeln.
Danke für Ihre Hilfe. Ich würde wirklich schätzen und beraten, was der beste Weg ist, um solche Dinge zu tun.
Edit: Option für ausgewählte mit mehreren einfachen Tabellen (ich glaube, OK ist)
CREATE TABLE IF NOT EXISTS node (
id integer PRIMARY KEY AUTOINCREMENT,
iri text NOT NULL,
UNIQUE(iri) ON CONFLICT IGNORE -- ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS functionality (
id integer PRIMARY KEY AUTOINCREMENT,
name text NOT NULL,
UNIQUE(name) ON CONFLICT IGNORE -- ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS address (
id integer PRIMARY KEY AUTOINCREMENT,
url text NOT NULL,
UNIQUE(url) ON CONFLICT IGNORE -- ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS push_info (
node integer NOT NULL,
functionality integer NOT NULL,
address integer NOT NULL,
UNIQUE(sensor, endpoint) ON CONFLICT IGNORE, -- ON CONFLICT REPLACE
FOREIGN KEY(node) REFERENCES node(id) ON DELETE CASCADE
FOREIGN KEY(functionality) REFERENCES functionality(id) ON DELETE CASCADE
FOREIGN KEY(address) REFERENCES address(id) ON DELETE CASCADE
);
SELECT address.url as address
FROM address
INNER JOIN push_info
ON address.id = push_info.address
INNER JOIN node
ON node.id = push_info.node
INNER JOIN functionality
ON functionality.id = push_info.functionality
WHERE
node.iri = "node1" AND
functionality.name = "functionality1";
Ihre Datenstruktur ist nicht klar. Kann jeder Knoten mit irgendeiner Funktionalität und jeder Adresse (und jeder Adresse mit irgendeinem Knoten und Funktionalität usw.) kombiniert werden, aber nicht alle von ihnen existieren automatisch? Dann wirst du mit einem Tisch wie diesem enden. Obwohl ich 'text' Bezeichner nicht verwenden würde, könntest du' varchar' verwenden (und sicherstellen, dass du nur gültige Werte eingibst und sie als Code behandelst) oder 2-3 Lookup-Tabellen mit allen Funktionen und Knoten (und vielleicht Adressen) verwenden und verwenden Sie ihre ID oder Code, um in diese Tabelle einzugeben. – Solarflare
@Solarflare Es ist wie Sie beschreiben, mehrere Knoten können die gleiche Funktion und Adresse haben, es ist wie ein alles alle. Die Nachschlagetabellen sind die normalisierte Option, die ich vorschlage, wo ich eine Liste von Knoten, eine Liste von Funktionen und eine Liste von Adressen habe. Dann werde ich mit einer Tabelle die IDs von jedem verbinden. Ist es sehr ressourcenintensiv? Oder ist es die bessere Option? Oder ist es besser, den Redis-Ansatz zu verwenden? – jlanza
Ihre Tabelle ist normalisiert wie sie ist. Die Verwendung von 3 Nachschlagetabellen hat nichts mit Normalisierung zu tun, Sie müssen es nur tun, wenn Sie z.B. eine Beschreibung oder andere Daten zusätzlich zu Ihrem Schlüssel (der eine Zeichenkette sein kann, obwohl ich 'varchar' dann verwenden würde, und sie kurz halten, vorzugsweise non-utf8), oder wenn Sie die Werte mit einem Fremdschlüssel validieren möchten . Ansonsten liegt es an Ihrem persönlichen Geschmack, wenn Sie sie durch ganzzahlige IDs ersetzen möchten. Gleiches gilt für redis oder mysql. 10k Zeilen machen performance-mäßig keinen Unterschied, es ist also persönlicher Geschmack. Fügen Sie einfach Indizes hinzu. – Solarflare