Ich habe kürzlich in Erlang getaucht, und ich entschied mich, Mnesia zu verwenden, um meine Datenbank-Arbeit zu tun, da es jede Art von Erlang-Datenstruktur problemlos speichern kann, mit Skala skalieren, mit Liste verwendet werden kann Comprehensions usw.Wahrung der relationalen Integrität mit Mnesia
Die meisten Zeilen, die aus SQL-Standarddatenbanken stammen, können und sollten durch einen Primärschlüssel identifiziert werden, normalerweise eine automatisch inkrementierende Ganzzahl. Standardmäßig betrachtet Mnesia das erste Feld einer Zeile als seinen Schlüssel. Es gibt auch keine Möglichkeit, einen inkrementierenden Ganzzahlschlüssel zu haben, soweit ich weiß.
Da ich diese fiktiven Aufzeichnungen meine Tabellen darstellen:
-record(user, {name, salt, pass_hash, email}).
-record(entry, {title, body, slug}).
-record(user_entry, {user_name, entry_title}).
Ich stelle dar, den Benutzernamen verwenden für einige Zwecke gut genug sein kann, wie es mit dem Eintrag Titel, um die Ressource zu identifizieren, aber wie Ich gehe Integrität bewahren?
Angenommen, der Benutzer ändert seinen Namen oder der Titel des Eintrags ändert sich nach einer Bearbeitung. Wie stelle ich sicher, dass meine Daten immer noch korrekt verknüpft sind? Jede Tabelle mit dem Benutzernamen zu aktualisieren, wenn sie sich ändert, klingt wie eine schreckliche Idee, egal wie sie gestellt wird.
Was wäre der beste Weg, um irgendeine Art von Primärschlüssel-System in Mnesia zu implementieren?
Auch, wie würde eine intermediäre Tabelle wie 'user_entry' tun, wenn das erste Feld in der Regel der Schlüssel ist? Was wäre sonst eine bessere Möglichkeit, eine Viele-zu-Viele-Beziehung in Mnesien darzustellen?
Ist es wirklich der gute Weg? es scheint, dass make_ref/0 seine Anzahl nach dem Neustart der Shell zurücksetzt und mehrere ähnliche Werte haben wird. Bedeutet das nicht, dass Sie nach einem Serverneustart schlechte Schlüssel bekommen könnten? Es könnte vielleicht helfen, es mit/0 zu koppeln. –
Es ist wahrscheinlich besser, jetzt/0 mit Knoten/0 zu kombinieren. –
Oder für die Angelegenheit, können Sie einfach das Uuid-Modul verwenden: http://github.com/travis/erlang-uuid/tree/master –