2009-09-17 11 views
9

Ich muss lange Zeichenfolgen in einer Datenbank speichern. Die Zeichenfolge kann 5 oder 6 Sätze lang sein. Glaubst du, das ist eine gute Designstrategie? oder sollte ich eine ID für diese Zeichenfolge speichern und dann eine Beziehung mit einer anderen Tabelle erstellen, die den Speicherort der Datei enthält, in der die Zeichenfolge gespeichert ist. könnten Sie bitte Vor- und Nachteile von beiden geben.Ist es gut, lange Strings in einer Datenbank zu speichern?

Die Strings wurden vorverarbeitet und in der Datenbank gespeichert. Jede Änderung würde die gesamte Zeichenfolge lesen und sie vollständig ersetzen. Sie können also davon ausgehen, dass die Zeichenfolge unteilbar ist.

+1

Dies ist in der Tat, warum SQL hat den TEXT-Typ (oh, und CLOB) – Powerlord

Antwort

11

Es sollte Es ist in Ordnung, die Zeichenfolge in der Datenbank zu speichern. Wenn Sie stattdessen einen Dateizeiger speichern, müssen Sie jedes Mal, wenn Sie die Zeichenfolge lesen möchten, Datei-E/A ausführen. Ein paar Sätze sind nicht sehr lang und Sie können immer ein Longtext-Datenfeld verwenden, wenn Sie müssen. Offensichtlich wird Ihre Datenbank ein bisschen größer sein, weil Sie den Text haben, aber das ist in Ordnung. Es ist sicherlich eine bessere Alternative als die Dateien zu speichern.

3

Fünf oder sechs Sätze sind nichts für ein modernes DBMS! Speichern Sie den Text direkt in der Datenbank.

(Die andere Technik, die Sie erwähnt - eine ref an einen anderen Tisch zu speichern, die sich einen ref auf eine externe Datei hat den Text halten - wäre viel umständlicher viel schlechtere Leistung zu verwenden und zu haben.)

+0

"Fünf oder sechs * Milliarden * Sätze ist nichts zu einem modernen DBMS!" – Xeoncross

4

Der einzige Grund, ich würde eine separate Tabelle erstellen, wenn diese langen Strings für viele Datensätze identisch sind. Ansonsten ist es nur eine zusätzliche Komplikation, die keine Rückzahlung verspricht.

+0

nein diese langen Saiten sind anders. Ich verstehe Ihren Punkt, sollte keine separate Tabelle verwendet werden. aber sollte ich die Zeichenkette im Dateisystem speichern und nur einen Zeiger auf die Datei in der Datenbank halten oder die Zeichenkette in der Datenbank selbst speichern. Vorschläge basierend auf der Leistung. –

+0

@iamrohitbanga: Also, * wie lange * sind sie genau? Alles, was bis zu ein paar Kilobytes (was für Text ziemlich viel ist) ist in Ordnung, in der Datenbank zu speichern. Alles oberhalb dieses Limits ist * noch * okay, aber Sie müssen die TEXT-Datentypen verwenden, die Ihr DBMS bietet. Die Idee, sie aus Performance-Gründen ins Dateisystem zu stellen, macht mir sehr viel Sinn. – Tomalak

+0

@iamrohitbanga: Diese Zeichenfolge muss wirklich von einiger bedeutender Größe sein, wir reden vielfache von 10K, bevor es (wenn überhaupt) lebensfähig wird, sie im Dateisystem mit all den Komplikationen zu speichern, die bringt. – AnthonyWJones

2

Die Antwort hängt wirklich von der Menge der Zeichenfolgen ab, die Sie speichern möchten, und von welcher Datenbank Sie beabsichtigen, sie zu speichern. Wenn Sie nicht viele Zeichenfolgen speichern, sollten Sie in Erwägung ziehen, sie in einer XML- oder Ressourcendatei zu speichern und diese im Vorfeld in Ihre Anwendung zu laden. Wenn Sie jedoch viele String-Daten haben, werden Sie wahrscheinlich besser daran arbeiten, die Zeichenfolge je nach Bedarf zu lesen, anstatt die Möglichkeit zu nutzen, eine Zeichenfolge in den Speicher zu lesen, die Sie nicht verwenden.

2

Die Datenbank selbst hat kein echtes Problem beim Speichern langer Strings. Es gelten einige Einschränkungen (wie die Größenbeschränkung der 8k-Datensätze in SQL Server), aber selbst dann könnten Sie Text beliebiger Länge in einer Datenbank speichern, da alle richtigen BLOB/TEXT-Datentypen praktisch ohne Obergrenze unterstützen.

Fünf bis sechs Sätze ist nicht wirklich lang. Wenn sie zusammengehören und als Ganzes abgerufen und bearbeitet werden sollen, können Sie sie in einem CHAR-Datentypfeld mit geeigneten Dimensionen speichern.

Die Frage, ob sie zu trennen und eine ID an sie anzuhängen, entsteht nur, wenn Ihr Anwendung/Datenmodell direkt von diesem Ansatz profitiert, d. H. In Wirklichkeit sind sie getrennte Dinge. In Ihrem Fall scheint es keinen Grund zu geben, so zu gehen.

0

Außer in besonderen Fällen würde ich das Feld verlassen, wo es ist.

Die einzige andere Option wäre, die Zeichenfolgen in eine andere Tabelle zu setzen (die eigentlichen Zeichenfolgen einzufügen) ... wenn Sie sie in separate Dateien schreiben, wird Ihre Leistung beeinträchtigt.

8

Die von Ihnen erwähnten Strings sind nicht lang.

Wenn Sie auf "lange" Strings verwiesen, dachte ich über 32kB und darüber - einige Sätze sind < 1kb - das ist heute nichts.

Ihr Trick, Speichern einer ID macht die Dinge langsamer, da Sie einen indirekten Zugriff haben müssen.

Das einzige, was ich empfehlen würde, wenn maximale Leistung benötigt wird, sollten Sie nur die Spalten auswählen, die Sie benötigen (SELECT * weglassen) - so die Textspalte weglassen, da nicht der Transport der Zeichenfolge aus Server zu Anwendung kostet die meiste Zeit. Es ist eine gute Praxis, nicht benötigte Spalten nicht zu berühren (besonders wenn sie viele Daten enthalten können).

1

Jeder hat Leistung erwähnt, aber niemand hat den anderen Hauptgrund angesprochen, warum das Speichern von Zeigern auf Betriebssystemdateien eine schlechte Idee ist: Sicherung und Wiederherstellung. Wenn alles in der Datenbank ist, haben wir einen einzigen Mechanismus zum Sichern der Daten und einen einzigen Mechanismus für die Wiederherstellung. Bei Dateien auf dem Betriebssystem haben wir zwei verschiedene Sicherungsmechanismen, wahrscheinlich mit zwei verschiedenen Granularitäten, und die Wiederherstellung wird zu einem Albtraum der Synchronisation.

Es gibt einige Fälle, in denen dies nicht zutrifft, z. B. Data Warehouses, die sehr selten Transaktionen haben und daher ohne Redo oder Transaktionsprotokolle überleben können.

Verwandte Themen