Frage

Was ist der beste Weg, um eine verknüpfte Liste in einer MySQL-Datenbank zu speichern, so dass Einsätze einfach sind (das heißt Sie nicht jedes Mal ein paar Sachen indizieren müssen) und dass die Liste leicht um herausgezogen werden kann.

War es hilfreich?

Lösung

Speichern Sie eine ganze Spalte in der Tabelle mit dem Namen ‚Position‘. Nehmen Sie ein 0 für das erste Element in der Liste, ein 1 für das zweite Element usw. Index, dass Spalte in Ihrer Datenbank, und wenn Sie möchten, dass Ihre Werte ziehen, sortiert nach dieser Spalte.

 alter table linked_list add column position integer not null default 0;
 alter table linked_list add index position_index (position);
 select * from linked_list order by position;

Um einen Wert einzufügen bei Index 3, ändert die Positionen der Zeilen 3 und höher, und dann ein:

 update linked_list set position = position + 1 where position >= 3;
 insert into linked_list (my_value, position) values ("new value", 3); 

Andere Tipps

Mit Adrian-Lösung, sondern um 1 zu inkrementieren, erhöhe um 10 oder sogar 100. Dann können Einfügungen bei der Hälfte der Differenz des Betrags berechnet, was Sie Einfügen zwischen ohne alles unter dem Einsetzen aktualisieren zu müssen. Wählen Sie eine Zahl groß genug, um Ihre durchschnittliche Anzahl von Einfügungen zu handhaben -. Wenn es zu klein, dann werden Sie auf der Aktualisierung alle Zeilen zurückgreifen müssen mit einer höheren Position während einer Einführungs

eine Tabelle mit zwei Spalten selbstbeziehende PreviousID und NextID erstellen. Wenn das Element das erste, was in der Liste ist, wird PreviousID null sein, wenn es das letzte ist, NextID null sein wird. Die SQL wird wie folgt aussehen:

create table tblDummy
{
     PKColumn     int     not null, 
     PreviousID     int     null, 
     DataColumn1     varchar(50)     not null, 
     DataColumn2     varchar(50)     not null,  
     DataColumn3     varchar(50)     not null, 
     DataColumn4     varchar(50)     not null, 
     DataColumn5     varchar(50)     not null, 
     DataColumn6     varchar(50)     not null, 
     DataColumn7     varchar(50)     not null, 
     NextID     int     null
}

Eine verkettete Liste kann mit rekursiven Zeiger in der Tabelle gespeichert werden. Dies ist sehr viel die gleichen Hierarchien in SQL gespeichert und dies wird die rekursive Assoziation Muster.

Sie können erfahren Sie mehr über das hier .

Ich hoffe, das hilft.

Die einfachste Möglichkeit wäre eine Tabelle mit einer Zeile pro Listenelement, eine Säule für die Position Position und Spalten für andere Daten in der Position sein zu schaffen. Dann können Sie ORDER BY auf der Position Spalte verwenden, in der gewünschten Reihenfolge abzurufen.

create table linked_list
(   list_id   integer not null
,   position  integer not null 
,   data      varchar(100) not null
);
alter table linked_list add primary key ( list_id, position );

die Liste bearbeiten nur die Position aktualisieren und dann einfügen / Löschen von Datensätzen je nach Bedarf. So ein Element in Liste einfügen 1 am Index 3:

begin transaction;

update linked_list set position = position + 1 where position >= 3 and list_id = 1;

insert into linked_list (list_id, position, data)
values (1, 3, "some data");

commit;

Da Operationen auf der Liste können mehrere Befehle benötigen (zB ein Einsatz wird eine INSERT und UPDATE erfordern), sicherzustellen, dass Sie immer die Befehle innerhalb einer Transaktion durchführen.

Eine Variation dieser einfache Möglichkeit ist Lage zu haben um einen bestimmten Faktor für jedes Element erhöht wird, sagen wir 100, so dass, wenn Sie eine INSERT führen Sie nicht immer die Position der folgenden Elemente neu zu nummerieren müssen. Dies erfordert jedoch ein wenig mehr Mühe heraus zu arbeiten, wenn die folgenden Elemente zu erhöhen, so dass Sie verlieren Einfachheit aber Verstärkungsleistung, wenn Sie viele Einsätze haben.

Je nach Bedarf andere Optionen ansprechen könnten, wie zum Beispiel:

  • Wenn Sie viele Manipulationen auf der Liste führen und nicht viele Auslagerungen Sie bevorzugen eine ID-Spalte zeigt auf das nächste Element in der Liste zu haben, anstatt eine Position Spalte zu verwenden. Dann müssen Sie iterative Logik in dem Abruf der Liste, um die Einzelteile, um zu bekommen. Dies kann relativ einfach in einem gespeicherten proc implementiert werden.

  • Wenn Sie viele Listen, eine schnelle Möglichkeit haben zu serialise und deserialise Ihre Liste Text / binär, und Sie immer nur die gesamte Liste speichern und abrufen mögen, dann speichern Sie die gesamte Liste als Einzelwert in einem einzelne Spalte. Wahrscheinlich nicht, was Sie für hier allerdings zu fragen.

Dieser Beitrag ist alt, aber immer noch meinen .02 $ gehen zu geben. jeden Datensatz in einer Tabelle oder Datensatz wird aktualisiert klingt verrückt Ordnung zu lösen. die Menge der Indizierung auch verrückt, aber es klingt wie die meisten haben es akzeptiert.

Crazy Lösung kam ich mit Updates und Indizierung zu reduzieren, ist zwei Tabellen zu erstellen (und in den meisten Anwendungsfällen Sie don die alle Datensätze sortieren in nur einem Tisch sowieso). Tabelle A die Aufzeichnungen der Liste zu halten, sind zu einer Gruppe sortiert und Tabelle B und halten eine Aufzeichnung der Reihenfolge als Zeichenfolge zurück. die Reihenfolge Zeichenfolge repräsentiert ein Array, das die ausgewählten Datensätze verwendet werden kann, eine Webseite Anwendung entweder auf der Web-Server oder Browser-Schicht zu bestellen.

Create Table A{
Id int primary key identity(1,1),
Data varchar(10) not null
B_Id int
}

Create Table B{
Id int primary key Identity(1,1),
GroupName varchat(10) not null,
Order varchar(max) null
}

Das Format des Auftrag Stachels sollte id, Position und einiger Separator sein aufzuspalten () die Zeichenfolge durch. im Fall von jQuery UI die .sortable ( ‚Serialisieren‘) Funktion gibt einen Befehl Zeichenfolge für Sie, dass POST freundlich ist, die die Identifikation und die Position jeden Datensatz in der Liste umfasst.

Die wirkliche Magie ist die Art und Weise Sie die ausgewählte Liste mit den gespeicherten Bestell Zeichenfolge neu zu ordnen wählen. dies hängt von der Anwendung ab, die Sie bauen. hier ist ein Beispiel wieder von jQuery die Liste der Elemente neu zu ordnen: http://ovisdevelopment.com/oramincite/ ? p = 155

https://dba.stackexchange.com/questions/46238/linked -list-in-sQL-and-Bäume einen Trick mit suggeriert Fließkommaposition Spalte für schnelle Einsätze und Bestellung.

Sie erwähnt auch spezielle SQL Server 2014 hierarchyid Funktion.

Es gibt ein paar Ansätze, die ich von rechts weg denken kann, die jeweils mit unterschiedlichen Ebenen der Komplexität und Flexibilität. Ich gehe davon aus, Ihr Ziel ist es, eine Ordnung in Retrieval zu bewahren, anstatt Speicherung als eine tatsächliche verknüpfte Liste erforderlich ist.

Das einfachste Verfahren wäre, einen Ordnungswert für jeden Datensatz in der Tabelle zugeordnet wird (beispielsweise 1, 2, 3, ...). Dann, wenn Sie die Datensätze abzurufen, geben Sie eine Bestellung durch die über der Ordnungs Spalte, um sie zu erhalten, um zurück.

auch Dieser Ansatz ermöglicht es Ihnen, die Datensätze ohne Rücksicht auf die Mitgliedschaft in einer Liste abrufen, sondern nur für die Mitgliedschaft ermöglicht es in einer Liste und kann eine zusätzliche „-Liste ID“ Spalte erfordern, um anzuzeigen, zu welcher Liste der Datensatz gehört.

Ein etwas aufwendigerer, aber auch flexiblerer Ansatz wäre es, Informationen über die Mitgliedschaft in einer separaten Tabelle in einer Liste oder Listen zu speichern. Die Tabelle müßte 3 Spalten: Die Liste ID, den Ordnungswert und einen Fremdschlüssel Zeiger auf den Datensatz. Bei diesem Ansatz kennen die zugrunde liegenden Daten nichts über seine Mitgliedschaft in Listen und leicht in mehreren Listen aufgenommen werden können.

Ich denke, die viel einfache Hinzufügen eine erstellten Spalte von Datetime Typ und eine Position Spalte von int, so können Sie jetzt doppelte Positionen haben, in der select-Anweisung verwenden, um die order by Position, erstellt ab Option und die Liste wird, um abgeholt werden .

Das ist etwas, das ich für eine Weile selbst herauszufinden versucht. Der beste Weg, die ich bisher gefunden habe, ist eine einzige Tabelle für die verknüpfte Liste zu erstellen, das folgende Format verwenden (diese Pseudo-Code ist):

LinkedList (

  • key1,
  • Informationen
  • key2

)

Schlüssel1 ist der Ausgangspunkt. Key2 ist ein Fremdschlüssel für sich in der nächsten Spalte zu verknüpfen. So Ihre Spalten etwas Link etwas wie dieser Link

col1

  • key1 = 0,
  • information = 'Hallo'
  • key2 = 1

Key1 ist Primärschlüssel col1. key2 ist ein Fremdschlüssel für die Schlüssel1 von col2 führenden

col2

  • key1 = 1,
  • Informationen = 'wassup'
  • key2 = null

key2 von col2 wird auf null gesetzt, weil es nicht zu irgendetwas nicht zeigen

Wenn Sie zuerst eine Spalte in der Tabelle eingeben, müssen Sie sicher key2 machen auf null gesetzt ist oder Sie eine Fehlermeldung erhalten. Nachdem Sie die zweite Spalte eingeben, können Sie zurückgehen und key2 der ersten Spalte auf den Primärschlüssel der zweiten Spalte.

Damit ist die beste Methode, viele Einträge auf einmal einzugeben, dann gehen Sie zurück und die Fremdschlüssel entsprechend gesetzt (oder eine GUI erstellen, die genau das tut das für Sie)

Hier einige aktuelle Code, den ich vorbereitet habe (alle aktuellen Code gearbeitet MSSQL Vielleicht möchten Sie einige der Forschung für die Version von SQL tun, die Sie verwenden.!):

createtable.sql

create table linkedlist00 (

key1 int primary key not null identity(1,1),

info varchar(10),

key2 int

)

register_foreign_key.sql

alter table dbo.linkedlist00

add foreign key (key2) references dbo.linkedlist00(key1)

* Ich habe sie in zwei separate Dateien, weil es in zwei Schritten getan werden muss. MSSQL werden Sie es in einem Schritt nicht zulassen, da die Tabelle für den Fremdschlüssel zu Referenz noch nicht existiert.

verlinkte Liste ist besonders leistungsfähig in one-to-many Beziehungen. Also, wenn Sie jemals eine Reihe machen von Fremdschlüssel gesucht? Gut, das ist eine Möglichkeit, es zu tun! Sie können eine primäre Tabelle machen, die in der verknüpften Liste Tabelle in die erste Spalte verweist, und dann anstelle der „Information“ Feld können Sie einen Fremdschlüssel auf die gewünschte Informationstabelle verwenden.

Beispiel:

Angenommen, Sie haben eine Bürokratie, die Formen hält.

Lassen Sie uns sagen, sie haben eine Tabelle mit dem Namen Aktenschrank

FileCABINET (

  • Cabinet ID (pk)
  • Dateien ID (fk) )

jede Spalte enthält einen Primärschlüssel für den Schrank und ein Fremdschlüssel für die Dateien. Diese Dateien können Steuerformulare sein, Krankenversicherung Papiere, Exkursions Berechtigungen schlüpft etc

Dateien (

  • Dateien ID (pk)

  • Datei-ID (fk)

  • Als nächste Datei-ID (fk)

)

Dies dient als Container für die Dateien

Datei (

  • Datei-ID (pk)

  • Informationen über die Datei

)

Dies ist die spezifische Datei

Es kann bessere Möglichkeiten, dies zu tun und es gibt, je nach Ihren spezifischen Bedürfnissen. Das Beispiel nur veranschaulicht mögliche Nutzung.

Eine Liste kann, indem eine Spalte enthält die Offset (Listenindexposition) gespeichert werden. - ein Einsatz in der Mitte dann alle über den neuen Elternteil erhöht wird und dann ein Insert tun

Erhöhe den SERIAL ‚Index‘ um 100, sondern manuell Zwischenwerte hinzufügen mit einem ‚index‘ gleich Prev + Next / 2. Wenn Sie jemals die 100 Zeilen sättigen, neu anordnen den Index zurück zu 100s.

Dies sollte Sequenz mit Primärindex beizubehalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top