Was ist der richtige path, um eine "list" in einer SQL-database zu speichern?

Also, ich habe viel darüber gelesen, wie das Stapeln mehrerer Werte in eine Spalte eine schlechte Idee ist und gegen die erste Regel der datanormalisierung verstößt (was überraschenderweise nicht "nicht über die datanormalisierung sprechen"), also brauche ich etwas Hilfe.

Im Moment entwerfe ich eine ASP .NET Webseite für den Ort, an dem ich arbeite. Ich möchte data auf einer Webseite anzeigen, je nachdem, welche Active Directory-Gruppen die Person gehört. Der erste path, dies zu tun, ist in den Sinn, einen Tisch mit, im Wesentlichen eine Spalte mit der AD-Gruppe und die zweite Spalte mit welcher list von Computern gehören zu dieser list zu haben.

Ich habe gelernt, dass dies zeigt große Missachtung für relationale databaseen, also was ist ein besserer path, es zu tun? Ich möchte diesen Zugriff durch SQL-Tabellen steuern, also kann ich aus diesen Tabellen hinzufügen / entfernen und den Endbenutzer entsprechend wechseln.

Danke für die Hilfe! 🙂

EDIT: Um genau zu beschreiben, was ich tun möchte, ist das:

Wir haben eine bestimmte Gruppe von Computern, die überprüft werden müssen, aber diese Computer sind in physisch schwierig zu Standorten zu erreichen. Die Organisation, zu der ich gehöre, hat die Fernbedienung für diese Computer aktiviert, aber sie sind nicht im Geschäft, das Fernsteuerungskennwort (verständlich) herauszugeben.

Die hinzugefügte Komplexität besteht darin, dass unsere Kunden je nach dem, was Sie sind, nur eine bestimmte Gruppe von Computern sehen können (dh die Gruppe von Computern, die ihr Gebiet besitzt). Also, wenn die Gruppe A Thomas hat, und die Gruppe B hat Jones darin, wenn du zu einer Gruppe gehörst, dann würdest du nur einen Eintrag sehen. Allerdings, wenn Sie zu beiden Gruppen gehören, sollten Sie beide Thomas und Jones Computer darin sehen.

Der Grund, warum ich denke, dass die memoryung dieser data in einer SQL-Zelle ist der path zu gehen ist, weil, um sie in Tabellen speichern würde erfordern (in meinem Kopf) eine neue Tabelle für jede neue "Gruppe" von Computern. Ich möchte keine SQL-Tabellen für jede neue Gruppe ausstoßen, ich hätte lieber nur eine weitere Zeile in einer SQL-Tabelle irgendwo.

Ist das sinnvoll?

Sie haben grundsätzlich drei Optionen in SQL server:

  • memoryn der Werte in einer Spalte.
  • memoryn der Werte in einer Kreuzungstabelle.
  • memoryn der Werte als XML (oder wie ein anderes strukturiertes dataformat).

(Andere databaseen haben andere Optionen wie Arrays, verschachtelte Tabellen und JSON.)

In fast allen Fällen ist die Verwendung eines Kreuzungstisches der richtige Ansatz. Warum? Hier sind einige Gründe:

  • SQL server hat (relativ) lausige String Manipulation, so dass etwas so einfach wie die Gewährleistung einer einzigartigen list ist wirklich, wirklich hart.
  • Eine Verbindungstabelle erlaubt Ihnen, viele andere Informationen zu speichern (Wann wurde eine Maschine hinzugefügt? Was ist die vollständige Beschreibung der Maschine? Etc. etc.).
  • Die meisten Abfragen, die Sie wollen, sind ziemlich einfach mit einem Kreuzungstisch (mit der einen exception von immer eine kommagetrennte list, leider – das ist nur counterintuitive eher als "hart").
  • Alle Typen sind nativ gespeichert.
  • Eine Junction-Tabelle ermöglicht es Ihnen, Einschränkungen (sowohl Check und Fremdschlüssel) auf die Elemente der list zu erzwingen.

Obwohl eine abgegrenzte list fast nie die richtige Lösung ist, ist es möglich, an Fälle zu denken, in denen es nützlich sein könnte:

  • Die list ändert sich nicht und die Darstellung der list ist sehr wichtig.
  • Raumnutzung ist ein Problem (leider, die Denormalisierung führt oft zu weniger Seiten).
  • Abfragen nicht wirklich Zugriff auf Elemente der list, nur die ganze Sache.

XML ist auch unter bestimmten Umständen eine vernünftige Wahl. In den neuesten Versionen von SQL server kann dies ziemlich effizient gemacht werden. Allerdings verursacht es den Overhead des Lesens und Parsing XML – und Dinge wie doppelte Beseitigung sind immer noch nicht offensichtlich.

Also hast du Optionen. In fast allen Fällen ist die Verbindungstabelle der richtige Ansatz.

Ich habe nicht wirklich eine schlechte Idee, mehrere Werte in einer Spalte zu speichern, aber hängt von der search ab, die du willst.

Wenn du nur die Personen kennen möchtest, die Teil einer Gruppe sind, kannst du Personen in einer Spalte mit einer Gruppen-ID als Schlüssel speichern. Für Update aktualisieren Sie einfach die gesamte list in einer Gruppe.

Aber wenn du eine bestimmte Person suchen möchtest, die zur Gruppe gehört, dann ist es nicht empfehlenswert, dass du diese Mehrfachpersonen in einer Spalte speicherst. In diesem Fall ist es besser, eine Itermedium-Tabelle zu speichern, die die Person-ID und die Gruppen-ID speichert.

Klingt wie Sie wollen eine Tabelle, die Benutzer zu Gruppen-IDs und eine zweite Tabelle, die Gruppen-IDs, die Computer in dieser Gruppe sind Karten. Ich bin mir nicht sicher, dass deine Sprache, die das Problem beschreibt, ein bisschen verwirrend für mich war.

Eine list hat einige Spalten wie: Name, Familienname, Telefonnummer etc. und Zeilen wie name = john familyName = lee number = 12321321 name = … familyname = … number = …

Eine SQL-database funktioniert gleichermaßen. jede Zeile in einer SQL-database ist ein datasatz. so dass Sie jusr hinzufügen datasätze Ihrer list in Ihre database mit Insert-Abfrage. vollständige erklärung hier: http://www.w3schools.com/sql/sql_insert.asp

Es gibt ein "es hängt", das Sie beachten sollten. Wenn die data niemals abgefragt werden (oder sehr selten abgefragt werden), die es als XML oder JSON speichern, wäre es absolut akzeptabel. Viele DBAs würden ausflippen, aber es ist viel schneller, den Blob von data zu erhalten, die du an den Client senden sollst, als einen Satz von Spalten aus einer sekundären Tabelle zu komponieren und zu zerlegen. (Es gibt ein Grunddokument und objectdatenbanken werden so beliebt.)

… obwohl ich fragen würde, warum replizieren Sie das aktive Verzeichnis in Ihre database und wie planen Sie, diese synchron zu halten.

Das klingt wie ein typisches viele-zu-viele-Problem . Sie haben viele Gruppen und viele Computer und sie sind miteinander verwandt. In dieser Situation wird oft empfohlen, eine Mapping-Tabelle, aka "Kreuzung Tabelle" oder "Querverweis" -Tabelle verwenden. Diese Tabelle besteht ausschließlich aus den beiden Fremdschlüsseln in deinen anderen Tabellen.

Wenn deine Tabellen so aussehen:

Computer - computerId - otherComputerColumns Group - groupId - othergroupColumns 

Dann würde dein Mapping-Tisch so aussehen:

 GroupComputer - groupId - computerId 

Und Sie würden einen einzelnen datasatz für jede Beziehung zwischen einer Gruppe und einem Computer insert. Dies entspricht den Regeln für die dritte Normalform in Bezug auf die databasenormierung.

Sie können eine Tabelle mit der Gruppe und der Gruppen-ID, eine andere Tabelle mit dem Computer und Computer-ID und eine dritte Tabelle mit der Beziehung der Gruppen-ID und Computer-ID.