Das Normalisieren Ihrer Betriebstabellen, wie von Transact Charlie vorgeschlagen, ist eine gute Idee und erspart im Laufe der Zeit viele Kopfschmerzen und Probleme. Es gibt jedoch Schnittstellentabellen , die die Integration in externe Systeme unterstützen, und Berichtstabellen , die beispielsweise analytische Funktionen unterstützen wird bearbeitet; und diese Arten von Tabellen sollten nicht unbedingt normalisiert werden - tatsächlich ist es sehr oft viel, viel bequemer und performanter, wenn sie es nicht sind .
In diesem Fall halte ich den Vorschlag von Transact Charlie für Ihre Operationstische für gut.
Ich würde jedoch einen Index (nicht unbedingt eindeutig) zu CompetitorName in der Competitors-Tabelle hinzufügen, um effiziente Verknüpfungen zu CompetitorName zum Zwecke der Integration (Laden von Daten aus externen Quellen) zu unterstützen, und ich würde eine Schnittstellentabelle in den Mix einfügen: CompetitionResults.
Wettbewerbsergebnisse sollten alle Daten enthalten, die Ihre Wettbewerbsergebnisse enthalten. Der Zweck einer solchen Schnittstellentabelle besteht darin, das Abschneiden und erneute Laden aus einer Excel-Tabelle, einer CSV-Datei oder einer beliebigen Form, in der Sie diese Daten haben, so schnell und einfach wie möglich zu gestalten.
Diese Schnittstellentabelle sollte nicht als Teil des normalisierten Satzes von Betriebstabellen betrachtet werden. Anschließend können Sie sich mit CompetitionResults verbinden, wie von Richard vorgeschlagen, um Datensätze in Wettbewerber einzufügen, die noch nicht vorhanden sind, und diejenigen zu aktualisieren, die dies tun (z. B. wenn Sie tatsächlich mehr Informationen über Wettbewerber haben, wie z. B. deren Telefonnummer oder E-Mail-Adresse).
Eine Sache, die ich beachten möchte - in Wirklichkeit ist es sehr unwahrscheinlich, dass der Name des Mitbewerbers in Ihren Daten eindeutig ist . Bei 200.000 Wettbewerbern können Sie beispielsweise zwei oder mehr David Smiths haben. Daher würde ich empfehlen, dass Sie mehr Informationen von Wettbewerbern sammeln, z. B. deren Telefonnummer oder E-Mail-Adresse oder etwas, das mit größerer Wahrscheinlichkeit eindeutig ist.
Ihre Betriebstabelle "Wettbewerber" sollte nur eine Spalte für jedes Datenelement enthalten, das zu einem zusammengesetzten natürlichen Schlüssel beiträgt. Beispielsweise sollte es eine Spalte für eine primäre E-Mail-Adresse geben. Die Schnittstellentabelle sollte jedoch einen Steckplatz für alte und neue Werte für eine primäre E-Mail-Adresse enthalten, damit der alte Wert verwendet werden kann, um den Datensatz in Mitbewerbern nachzuschlagen und diesen Teil auf den neuen Wert zu aktualisieren.
Daher sollten CompetitionResults einige "alte" und "neue" Felder enthalten - oldEmail, newEmail, oldPhone, newPhone usw. Auf diese Weise können Sie in Competitors einen zusammengesetzten Schlüssel aus CompetitorName, Email und Phone bilden.
Wenn Sie dann einige Wettbewerbsergebnisse haben, können Sie Ihre CompetitionResults-Tabelle von Ihrer Excel-Tabelle oder von allem, was Sie haben, abschneiden und neu laden und eine einzelne, effiziente Einfügung ausführen, um alle neuen Wettbewerber in die Competitors-Tabelle einzufügen, sowie eine einzelne, effiziente Aktualisierung, um sie zu aktualisieren Alle Informationen zu den bestehenden Wettbewerbern aus den Wettbewerbsergebnissen. Sie können eine einzelne Einfügung vornehmen, um neue Zeilen in die CompetitionCompetitors-Tabelle einzufügen. Diese Dinge können in einer gespeicherten Prozedur von ProcessCompetitionResults ausgeführt werden, die nach dem Laden der CompetitionResults-Tabelle ausgeführt werden kann.
Dies ist eine Art rudimentäre Beschreibung dessen, was ich in der realen Welt mit Oracle Applications, SAP, PeopleSoft und einer Wäscheliste anderer Unternehmenssoftware-Suiten immer wieder gesehen habe.
Ein letzter Kommentar, den ich machen möchte, ist einer, den ich zuvor zu SO gemacht habe: Wenn Sie einen Fremdschlüssel erstellen, der sicherstellt, dass ein Konkurrent in der Konkurrententabelle vorhanden ist, bevor Sie CompetitionCompetitors eine Zeile mit diesem Konkurrenten hinzufügen können, stellen Sie dies sicher Der Fremdschlüssel ist so eingestellt, dass Aktualisierungen und Löschungen kaskadiert werden . Auf diese Weise können Sie einen Konkurrenten löschen, und alle mit diesem Konkurrenten verknüpften Zeilen werden automatisch gelöscht. Andernfalls müssen Sie für den Fremdschlüssel standardmäßig alle zugehörigen Zeilen aus CompetitionCompetitors löschen, bevor Sie einen Mitbewerber löschen können.
(Einige Leute denken, dass nicht kaskadierende Fremdschlüssel eine gute Sicherheitsmaßnahme sind, aber meine Erfahrung ist, dass sie nur ein verdammter Schmerz im Hintern sind, der meistens nur das Ergebnis eines Versehens ist und eine Menge Arbeit schafft Für DBAs. Der Umgang mit Personen, die versehentlich Inhalte löschen, ist der Grund, warum Sie Dinge wie "Sind Sie sicher" -Dialoge und verschiedene Arten von regelmäßigen Sicherungen und redundanten Datenquellen haben. Es ist weitaus üblicher, einen Konkurrenten tatsächlich löschen zu wollen, dessen Daten alle sind vermasselt zum Beispiel, als es ist, versehentlich einen zu löschen und dann zu sagen: "Oh nein! Ich wollte das nicht tun! Und jetzt habe ich nicht ihre Wettbewerbsergebnisse! Aaaahh!" Letzteres ist sicherlich häufig genug, also Sie müssen darauf vorbereitet sein, aber ersteres ist weitaus häufiger.Der einfachste und beste Weg, sich auf das erstere vorzubereiten, besteht darin, nur Aktualisierungen und Löschungen für Fremdschlüsselkaskaden vorzunehmen.)
NVARCHAR(64)
Spalte Ihre primäre (und damit: Clustering) Schlüssel !! Zuallererst - es ist ein sehr breiter Schlüssel - bis zu 128 Bytes; und zweitens ist es eine variable Größe - wieder: nicht optimal ... Dies ist die schlechteste Wahl, die Sie treffen können - Ihre Leistung wird die Hölle sein und die Fragmentierung von Tabellen und Indizes wird die ganze Zeit bei 99,9% liegen .....