2010-05-19 2 views
6

Warum besteht jedes RDBMS darauf, dass Sie ihm sagen, wie hoch die maximale Länge eines Textfelds sein wird? Warum kann es nicht einfach auf diese Informationen aus den Daten in der Datenbank schließen?Warum muss ich die maximale Länge jeder einzelnen Textspalte in der Datenbank festlegen?

Ich habe meistens mit MS SQL Server gearbeitet, aber jede andere Datenbank, die ich kenne, verlangt auch, dass Sie diese willkürlichen Grenzen für Ihr Datenschema setzen. Die Realität ist, dass dies nicht besonders hilfreich oder freundlich zu arbeiten ist, da sich die Geschäftsanforderungen ständig ändern und fast jeden Tag versucht ein Endanwender, viel Text in diese Spalte zu schreiben.

Kennt jemand mit etwas innerem Wissen über ein RDBMS, warum wir nur die Grenzen aus den Daten, die in den Speicher gelegt werden, nicht ableiten? Ich spreche nicht über das Erraten der Typinformationen, sondern über die Grenzen einer bestimmten Textspalte.

Ich meine, es gibt einen Grund, warum ich nvarchar (max) nicht für jede Textspalte in der Datenbank verwende.

+0

Ich habe keine "innere Arbeitskenntnisse eines RDBMS" , aber ich verstehe nicht, warum du das für ein Problem hältst. Es gibt ungebundene Datentypen wie CLOBs. Wenn es das ist, was du willst, dann benutze es. Wenn Sie leichtere Textvergleiche machen müssen, müssen Sie den Tippschmerz (255) oder was auch immer erleiden. Scheint es nicht wert, sich über mich zu beschweren. Aber das sind nur meine zwei Cent. – MJB

+2

Es ist erwähnenswert, dass SQLite diese Anforderung nicht auferlegt. – cikkle

+0

Es ist logisch unmöglich, aus den tatsächlich gegebenen Daten eine maximale Länge abzuleiten. Wie lange sollte die Datenbank warten, bis sie entscheidet: "OK, ich denke, es wird nie mehr als 255 Zeichen geben"? –

Antwort

5

Weil Computer (und Datenbanken) dumm sind.Computer raten nicht sehr gut und, wenn Sie ihnen nicht sagen, können sie nicht sagen, dass eine Spalte für eine Telefonnummer oder eine Kopie von Krieg und Frieden verwendet wird. Offensichtlich könnte die DB so entworfen werden, dass jede Spalte eine unendliche Menge an Daten enthalten könnte - oder zumindest so viel, wie es der Speicherplatz erlaubt -, aber das wäre ein sehr ineffizientes Design. Um Effizienz zu erzielen, machen wir einen Kompromiss und lassen den Designer der Datenbank mitteilen, wie viel wir in die Spalte einbringen möchten. Vermutlich könnte es einen Standard geben, so dass wenn Sie keinen angeben, es einfach verwendet. Leider wäre jeder Ausfall für die große Mehrheit der Menschen aus Effizienzgründen ungeeignet.

+0

Eine Spalte mit einer Telefonnummer wird in der Regel etwa 10 Zeichen lang sein. Wenn dies der Fall ist, macht es durchaus Sinn, dass die Datenbank dies wie etwa varchar (13) behandelt. Bei Spalten, die stark voneinander abweichen, gibt es im ungünstigsten Fall den Fall, dass die Spalte standardmäßig den Wert varchar (max) hat. Für diese Szenarien wäre es nützlich, einen selbstoptimierenden Textdatentyp zu verwenden. –

+0

@John - also, was Sie wirklich fragen, ist nicht für aktuelle Datenbanken, um einfach einen Standard abzuleiten, sondern vielmehr, dass Datenbank-Speicher-Engines die Art, wie sie Speicher zuweisen, grundlegend verändern. Ich habe ehrlich gesagt nicht viel über dieses Thema geforscht, aber ich würde mir vorstellen, dass Schemen wie diese am Ende Character-Daten in ihren eigenen "Container" ziehen, ähnlich und mit den gleichen Problemen von Varchar (Max). Es ist ein interessantes Gedankenexperiment, aber nicht besonders relevant für meine tägliche Arbeit. – tvanfosson

+0

Ich denke ich bin. Allerdings glaube ich, dass der Datentyp varchar (max) für diese Szenarien viel besser ist als ich ursprünglich dachte. Es scheint, dass es in Abhängigkeit von der Größe des Werts tatsächlich einige Zeilenspeicherentscheidungen trifft. –

0

Ich denke, es ist, weil die RDBMS zufälligen Datenzugriff verwenden. Um einen zufälligen Datenzugriff durchzuführen, müssen sie wissen, auf welche Adresse auf der Festplatte sie springen müssen, um die Daten schnell zu lesen. Wenn jede Zeile einer einzelnen Spalte unterschiedliche Datenlänge hat, können sie nicht ableiten, was der Startpunkt der Adresse ist, die sie direkt springen müssen, um sie zu erhalten. Der einzige Weg ist, dass sie alle Daten laden und überprüfen müssen.

Wenn RDBMS die Datenlänge einer Spalte in eine feste Zahl ändert (z. B. die maximale Länge aller Zeilen), jedes Mal, wenn Sie hinzufügen, aktualisieren und löschen. Es ist ein extrem zeitaufwendig

+0

mit dem Unterschied, dass sie es wirklich mit einem Varchar optimieren - ein Carchar (3000) teilt nicht immer alle 3000 Bytes die ganze Zeit;) – TomTom

+0

@Tomtom - klingt, als gäbe es kein Argument dafür, nicht alle auf (8000) seit Speicher zu setzen ist kein Problem. – JeffO

1

This post nicht nur beantwortet Ihre Frage, ob nvarchar(max) überall zu verwenden, aber es gibt auch einen Einblick, warum Datenbanken historisch dies nicht zulassen.

1

Das ist wie zu sagen, warum können wir nicht einfach der Datenbank sagen, wir wollen eine Tabelle und lassen Sie ableiten, welchen Typ und wie viele Spalten wir brauchen, aus den Daten, die wir es geben.

Einfach, wir wissen besser als die Datenbank. Angenommen, Sie haben eine Chance von eins zu einer Million, eine Zeichenkette mit 2.000 Zeichen in die Datenbank zu schreiben, meistens sind es 100 Zeichen. Die Datenbank würde wahrscheinlich die 2k-Zeichenfolge sprengen oder ablehnen. Es kann einfach nicht wissen, dass Sie 2k Länge benötigen, wenn Sie in den ersten drei Jahren nur 100 Länge Zeichenfolgen eingegeben haben.

Auch die Länge der Zeichen wird verwendet, um die Zeilenplatzierung zu optimieren, sodass Zeilen schneller gelesen/übersprungen werden können.

0

Was würde die DB schätzen? Wenn sich die Geschäftsanforderungen regelmäßig ändern, wird es genauso überrascht sein wie Sie. Wenn es einen Grund, warum Sie nvarchar (max) nicht verwenden, gibt es wahrscheinlich ein Grund, es nicht zu, dass auch Verzug ...

2

Es Geschwindigkeit zu tun hat. Wenn die maximale Größe eines Strings angegeben ist, können Sie die Art und Weise optimieren, in der Informationen für einen schnelleren E/A gespeichert werden. Wenn Geschwindigkeit der Schlüssel ist, ist das Letzte, was Sie wollen, ein plötzliches Mischen all Ihrer Daten, nur weil Sie eine Zustandsabkürzung in den vollen Namen geändert haben.

Wenn die maximale Größe festgelegt ist, kann die Datenbank allen Entitäten in dieser Spalte den maximalen Speicherplatz zuweisen und unabhängig von den Änderungen des Werts muss kein Adressraum geändert werden.

+1

aber es tut das nicht - schlechte Nachrichten. Jede ordentliche Datenbank benutzt 3000 Bytes NICHT um ein varchar (3000) Feld mit nur 4 Zeichen zu speichern;) Vor langer Zeit -yes. Seit 20 Jahren - nein. – TomTom

+1

@ TomTom: Es ist jedoch nützlich für die Datenbank zu wissen, dass das Varchar (3000) Feld nicht mehr als 3K Zeichen dauert. Es ist wirklich schwierig, eine gute Zuordnung von Zeilen zu Festplattensektoren einzurichten, ohne zu wissen, wie groß eine Zeile sein kann. –

+0

Wie sage ich mycolumn varchar (max) anders als die Datenbank Abfrage der Tabelle für MAX (LEN (Mycolumn))? Zu irgendeinem Zeitpunkt wird es immer in der Lage sein zu sagen, dass meine Spalte einer Reihe eine bestimmte Größe hat, diese Größe wird jedoch nicht konstant sein. –

0

Um ein Beispiel zu nennen, gehe ich in einen Quicksand und schlage vor, Sie vergleichen mit Anwendungen, die Speicher (RAM) zuweisen. Warum fragen Programmierer nicht den gesamten Speicher, den sie benötigen, wenn das Programm startet? Weil sie oft nicht wissen, wie viel sie brauchen. Dies kann dazu führen, dass Anwendungen immer mehr Speicher abrufen und möglicherweise auch Speicher freigeben. Und Sie haben mehrere Apps gleichzeitig, neue Apps werden gestartet und alte Apps werden geschlossen. Und Apps möchten immer zusammenhängende Speicherblöcke, die (wenn überhaupt) nur schlecht funktionieren, wenn ihr Speicher über den gesamten Adressraum verstreut ist. Im Laufe der Zeit führt dies zu fragmentierter Erinnerung und zu all den Müllsammelproblemen, über die sich die Menschen seit Jahrzehnten die Haare raufen.

Zurück zu Datenbanken. Möchten Sie, dass das mit Ihren Festplatten passiert? (Denken Sie daran, Festplatte Leistung ist sehr, sehr langsam im Vergleich zu Speicheroperationen ...)

+0

Ich sehe nicht, wie das relevant ist. Ich würde niemals zulassen, dass der Benutzer willkürliche Speicherzuweisungen verwaltet. Das ist unverantwortlich und möglicherweise ein Sicherheitsrisiko. Die Datenbank kann ihre Meinung basierend auf Statistiken bilden, wenn kein Konsens erreicht werden kann, dann sagt sie standardmäßig varchar (max), aber das passiert jedes Mal unwahrscheinlich. –

0

Klingt wie Ihre Geschäftsregel lautet: Geben Sie so viele Informationen wie Sie wollen in einem Textfeld, so dass Sie nicht bekommen sauer auf den DBA.

Sie dürfen keine 5000-Zeichen-Adressen eingeben, da sie nicht auf den Umschlag passen.

Deshalb hat Twitter eine Textbeschränkung und rettet jedem die Mühe, durch ein Bündel von gedankenlosen Gedanken zu lesen, die einfach weiterlaufen und nie auf den Punkt kommen, sondern nur den Leser wütend machen und sie sich wundern, warum Solche Vernachlässigung für ihre Zeit durch die Wahl eines egozentrischen und unmenschlichen Lebensstils konzentrierte sich auf die Förderung der Akt des Kopierens und Einfügens so viele Daten wie die Speicher-Puffer-Götter ermöglichen ...

Verwandte Themen