Ich muss Telefonnummern in einer Tabelle speichern. Bitte schlagen Sie vor, welchen Datentyp ich verwenden soll. Warten. Bitte lesen Sie weiter, bevor Sie auf Antwort klicken.
Dieses Feld muss stark indiziert werden, da Vertriebsmitarbeiter dieses Feld für die Suche verwenden können (einschließlich der Suche nach Platzhaltern).
Ab sofort erwarten wir Telefonnummern in verschiedenen Formaten (aus einer XML-Datei). Muss ich einen Parser schreiben, um in ein einheitliches Format zu konvertieren? Es könnten Millionen von Daten (mit Duplikaten) vorhanden sein, und ich möchte die Serverressourcen nicht jedes Mal (bei Aktivitäten wie zu viel Vorverarbeitung) binden, wenn Quelldaten eingehen.
Anregungen sind willkommen ..
Update: Ich habe keine Kontrolle über Quelldaten. Nur dass die Struktur der XML-Datei Standard ist. Möchte die XML-Analyse auf ein Minimum beschränken. Sobald es in der Datenbank ist, sollte der Abruf schnell sein. Ein verrückter Vorschlag hier ist, dass es sogar mit der Ajax AutoComplete-Funktion funktionieren sollte (damit Vertriebsmitarbeiter die passenden sofort sehen können). OH MEIN GOTT!!
quelle
Antworten:
Umfasst dies:
Wenn all dies nein ist, würde ich ein 10-Zeichen-Feld verwenden und alle nicht numerischen Daten entfernen. Wenn das erste ein Ja und die anderen beiden ein Nein sind, würde ich zwei varchar (50) -Felder verwenden, eines für die ursprüngliche Eingabe und eines mit allen nicht numerischen Daten, die gestreift und für die Indizierung verwendet werden. Wenn 2 oder 3 ja sind, würde ich wahrscheinlich zwei Felder und eine Art verrückten Parser erstellen, um festzustellen, was eine Erweiterung oder andere Daten sind, und um angemessen damit umzugehen. Natürlich könnten Sie die zweite Spalte vermeiden, indem Sie etwas mit dem Index tun, bei dem die zusätzlichen Zeichen beim Erstellen des Index entfernt werden, aber ich würde nur eine zweite Spalte erstellen und wahrscheinlich das Entfernen von Zeichen mit einem Auslöser durchführen.
Update: Um das AJAX-Problem zu beheben, ist es möglicherweise nicht so schlimm, wie Sie denken. Wenn dies realistisch gesehen die Hauptmethode ist, mit der Tabelle zu arbeiten, speichern Sie wie gesagt nur die Ziffern in einer sekundären Spalte und machen Sie dann den Index für diese Spalte zur gruppierten.
quelle
decimal(10,0)
stattchar
?decimal(10,0)
Sie führende Nullen wieder auf die ZahlWir verwenden varchar (15) und indizieren auf jeden Fall dieses Feld.
Der Grund dafür ist, dass internationale Standards bis zu 15 Stellen unterstützen können
Wikipedia - Telefonnummernformate
Wenn Sie internationale Nummern unterstützen, empfehle ich die separate Speicherung eines Weltzonen- oder Ländercodes, um Abfragen besser zu filtern, damit Sie nicht die Länge Ihrer Telefonnummernfelder analysieren und überprüfen müssen, um die Anzahl der zurückgegebenen Anrufe in die USA zu begrenzen Beispiel
quelle
decimal(10,0)
dann stattchar
?Verwenden Sie CHAR (10), wenn Sie nur US-Telefonnummern speichern. Entfernen Sie alles außer den Ziffern.
quelle
Ich vermisse hier wahrscheinlich das Offensichtliche, aber würde ein Varchar nicht lange genug für Ihre am längsten erwartete Telefonnummer funktionieren?
Wenn ich bin etwas fehlt offensichtlich, ich würde es lieben , wenn jemand sie weisen darauf hin , ...
quelle
Ich würde einen Varchar (22) verwenden. Groß genug, um eine nordamerikanische Telefonnummer mit Nebenstelle zu halten. Sie möchten alle bösen '(', ')', '-' Zeichen entfernen oder sie einfach alle in einem einheitlichen Format analysieren.
Alex
quelle
SQL Server 2005 ist ziemlich gut für Teilzeichenfolgenabfragen für Text in indizierten Varchar-Feldern optimiert. Für 2005 führten sie neue Statistiken in die Zeichenfolgenübersicht für Indexfelder ein. Dies hilft erheblich bei der Volltextsuche.
quelle
Die Verwendung von Varchar ist ziemlich ineffizient. Verwenden Sie den Geldtyp und erstellen Sie daraus einen vom Benutzer deklarierten Typ "Telefonnummer". Erstellen Sie eine Regel, die nur positive Zahlen zulässt.
Wenn Sie es als (19,4) deklarieren, können Sie sogar eine 4-stellige Nebenstelle speichern, die groß genug für internationale Nummern ist und nur 9 Byte Speicherplatz benötigt. Indizes sind auch schnell.
quelle
money
nicht die Antwort ist, wenn die Suche nach Teilzeichenfolgen nicht erforderlich ist (und ich würde mir vorstellen, dass viele nicht nach einem Datensatz suchen müssen, der nur auf einem Teil einer Telefonnummer basiert), was wäre falsch an der Verwendungdecimal(10,0)
?nvarchar mit Vorverarbeitung, um sie so weit wie möglich zu standardisieren. Sie möchten wahrscheinlich Erweiterungen extrahieren und in einem anderen Feld speichern.
quelle
Normalisieren Sie die Daten und speichern Sie sie als Varchar. Das Normalisieren kann schwierig sein.
Das sollte ein einmaliger Erfolg sein. Wenn dann ein neuer Datensatz eingeht, vergleichen Sie ihn mit normalisierten Daten. Sollte sehr schnell sein.
quelle
Da Sie viele verschiedene Telefonnummernformate verwenden müssen (und wahrscheinlich Dinge wie Nebenstellen usw. enthalten müssen), ist es möglicherweise am sinnvollsten, sie wie jedes andere Varchar zu behandeln. Wenn Sie die Eingabe steuern könnten, könnten Sie verschiedene Ansätze wählen, um die Daten nützlicher zu machen, aber das klingt nicht so.
Sobald Sie sich entschieden haben, es einfach wie eine andere Zeichenfolge zu behandeln, können Sie sich darauf konzentrieren, die unvermeidlichen Probleme in Bezug auf fehlerhafte Daten, die Bildung mysteriöser Telefonnummern und alles, was sonst noch auftaucht, zu überwinden. Die Herausforderung wird darin bestehen, eine gute Suchstrategie für die Daten zu entwickeln und nicht, wie Sie sie meiner Meinung nach speichern. Es ist immer eine schwierige Aufgabe, mit einem großen Datenstapel umzugehen, über den Sie keine Kontrolle hatten.
quelle
Verwenden Sie SSIS, um die Informationen zu extrahieren und zu verarbeiten. Auf diese Weise wird die Verarbeitung der XML-Dateien von SQL Server getrennt. Bei Bedarf können Sie die SSIS-Transformationen auch auf einem separaten Server durchführen. Speichern Sie die Telefonnummern mit VARCHAR in einem Standardformat. NVARCHAR wäre unnötig, da es sich um Zahlen und möglicherweise einige andere Zeichen handelt, wie '+', '', '(', ')' und '-'.
quelle
Verwenden Sie ein
varchar
Feld mit einer Längenbeschränkung.quelle
Es ist ziemlich üblich, ein "x" oder "ext" zu verwenden, um Erweiterungen anzuzeigen. Erlauben Sie daher 15 Zeichen (für volle internationale Unterstützung) plus 3 (für "ext") plus 4 (für die Erweiterung selbst), was insgesamt 22 Zeichen ergibt . Das sollte dich beschützen.
Alternativ können Sie bei der Eingabe normalisieren, sodass jedes "ext" in "x" übersetzt wird, was maximal 20 ergibt.
quelle
Es ist immer besser, separate Tabellen für mehrwertige Attribute wie die Telefonnummer zu haben.
Da Sie keine Kontrolle über Quelldaten haben, können Sie die Daten aus der XML-Datei analysieren und in das richtige Format konvertieren, damit es keine Probleme mit den Formaten eines bestimmten Landes gibt. Speichern Sie sie in einer separaten Tabelle, damit die Indizierung und Das Abrufen beider ist effizient .
Vielen Dank.
quelle
Mir ist klar, dass dieser Thread alt ist, aber es lohnt sich, den Vorteil des Speicherns als numerischer Typ für Formatierungszwecke zu erwähnen, insbesondere in .NET Framework.
IE
.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
quelle
Verwenden Sie stattdessen den Datentyp long. Verwenden Sie nicht int, da nur ganze Zahlen zwischen -32.768 und 32.767 zulässig sind. Wenn Sie jedoch den langen Datentyp verwenden, können Sie Zahlen zwischen -2.147.483.648 und 2.147.483.647 einfügen.
quelle