2010-12-29 5 views
4

ich durch die Mnesia Dokumentation und die 3 beliebten Erlang Bücher ausgesehen haben. Es scheint, dass nur einspaltige primäre und sekundäre Indizes erstellt und verwendet werden können. Oder ist es nur, was die Beispiele abdecken? Wenn ich für jede der Spalten einen eigenen Index erstelle/kann Mnesia sie intelligent zusammen verwenden, um mehrspaltige Schlüsselindexsuchen zu simulieren? Wenn ja, wäre die Leistung viel besser als ein einfacher Tabellenscan? Wie kann ich erstellen und verwenden (oder simulieren) Indizes mit mehreren Spalten in Erlang Mnesia

Wenn mehrspaltigen Indizierung nicht von Mnesia, da unterstützt wird seine eine native dbms hat jemand diese Funktionalität in Erlang simuliert.

Zweite Qestion: Wie wäre die Simulation Bedingungen (Referenz, check), Trigger und ereignisbasierte Benachrichtigungen?

Antwort

5

Eine Möglichkeit ist {X, Y} direkt in der „Spalte“ zu speichern, die den Schlüssel hat. Dadurch können Sie schnell nach Abfragen der Struktur {_, _} suchen, aber es bedeutet auch eine langsamere Suche, wenn Sie nur einen der Werte im Tupel kennen (standardmäßig sind die Tabellen Hashtabellen).

Was Ihre andere DBMS will: Mnesia war nicht wirklich traditionelle Datenbanken so viel zu ersetzen gebaut, wie es gebaut wurde, um die Bedürfnisse der Ericsson Devs zu erfüllen, wenn ihre Anwendungen zu schreiben. Sie können also besser Daten in einer herkömmlichen Datenbank speichern, wenn Sie das anstreben.

Sie in der Lage sein, die Funktionalität mit dem Code um Mnesia jedoch hinzuzufügen - wenn es das ist, was Sie wollen.

+0

Vielen Dank. Nur um es besser zu verstehen: mit Tabelle (Mitarbeiter, {id, {sal, lname, fname}, Geschlecht, Telefon} mache ich mnesia: add_table_index (Mitarbeiter, {sal, lname, fname}) um nach Gehalt zu sortieren, dann Name mit tuple- field {sal, lname, fname}? Akzeptiert Mnesia Tupled-Tabellenfelder und Tupel-Indexfelder? Oder eher programmatisch manuell meine Schlüsselfelder Daten in der Reihenfolge in einem einzigen Schlüsselfeld, das ich jetzt als Schlüsselfeld verwenden? Das klingt ein wenig naiv, aber ich bin ziemlich neu bei all dem. Ich bin bereit, Dinge auszuprobieren und würde diese Alternativen ausprobieren, aber jede Hilfe wird geschätzt.Joe Pee – user557513

+0

Bitte ignorieren Sie bitte meine letzte Frage, da die Antwort offensichtlich ist. Vielen Dank. – user557513

1

Mnesia verfügt über ereignisbasierte Benachrichtigungen. Es ist möglich, einen Prozess (gen_server) zu haben, der mnesia-Ereignisse abonniert. Diese Ereignisse sind kategorisiert: Tabellenereignisse, Systemereignisse und andere. Lesen Sie die mnesia-Dokumentation im Teil über Ereignisse. Es ist tatsächlich möglich, dass ein Prozess Ereignisse mithilfe des mnesia-Ereignishandlers meldet, indem er Folgendes aufruft: mnesia:report_event(Event). Alle für mnesia-Ereignisse abonnierten Prozesse erhalten diese Nachricht. Mnesia berichtet Echtzeit-Informationen über alle Transaktionen in einer Tabelle an abonnierte Prozesse. Es können Transaktionen gelesen, geschrieben oder gelöscht werden, und ein Prozess in seiner Schleife kann mit dem Ereignistyp übereinstimmen, an dem er interessiert sein könnte. Es gibt detaillierte und einfache Tabellenereignisse. Ich persönlich fand die Ereignisse sehr nützlich. Sie sollten in der Lage sein, die Details aus der Dokumentation zu erhalten.

Über Ereignisse. Jetzt speichern MN-Tabellen Datensätze desselben Typs. Diese Informationen können unter der Telefonnummer mnesia:table_info(Table_name::atom(),attributes) abgerufen werden. Wenn Indizes auf eine Mnisia-Tabelle angewendet werden, akzeptiert sie jedes Feld dieser Attribute, solange es nicht das erste Datensatzfeld ist (normalerweise "Primärschlüssel" genannt). Diese Indizes sind besser, wenn sie bei der Tabellenerstellung als zur Laufzeit aufgrund von a angewendet werden Anzahl der Gründe. Betrachten Sie den Code-Schnipsel unten

 
-record(employee,{id,first_name,other_name,sex,age,job}). 

install(Nodes)-> 
    mnesia:create_schema(Nodes), 
    mnesia:start(), 
    mnesia:create_table(employee,[{index,[age,sex,first_name,job]},
{attributes,record_info(fields,employee)}]), mnesia:stop(), ok.

wenn ich Ihre Frage richtig verstanden habe, kann ich jetzt sagen, dass die Tabelle Mitarbeiter Spalten: Alter, Geschlecht, first_name, OTHER_NAME und Job indiziert und alle Mnesia APIs für Rekord Suche basierend auf indizierten Attributen wiil arbeiten z mnesia:index_read/3 or mnesia:index_match_object/2 or mnesia:index_match_object/4. Glück

/[email protected]

Verwandte Themen