2013-01-15 6 views
5

Ok vor kurzem eine Frage, die ich gefragt und Nutzer Fragen ist, dass ich meine Datenbank normalisieren soll, aber ich glaube nicht, dass ich es wirklich tun soll ..Muss ich wirklich meine Datenbank normalisieren?

Die Logik ähnliche

Am Speichern von Skripten in der Datenbank geht die dynamisch entsprechend den Benutzer ausgeführt ..

So zum Beispiel eine Skript Tabelle gibt es

script_id | script_name 
+----------------------+ 
12345  demo1 
54462  demo2 
90874  demo3 
43058  demo4 

Und nun die Benutzertabelle

allowed_script_ids 
+-----------------+ 
21345|90874 

So ist das hier einfach, aber was passiert, wenn ich 90874 sagen script_id löschen, aber nicht den Datensatz aus der Benutzertabelle entfernen, damit sie mir vorgeschlagen, die Datenbank für die Normalisierung, aber was ist, wenn Benutzer hat Zugriff zu 1000 Skripten? Brauche ich 1000 Datensätze dafür? Oder sollte ich mit dem Weg weitermachen? Selbst wenn ich jeden Datensatzeintrag für jeden Zugriff einfüge, muss ich ihn jedes Mal löschen, wenn ich den Zugriff für diesen Benutzer widerrufe.

+0

Ja, wenn der Benutzer Zugriff auf 1000 Skripts hat, dann sind das 1000 Einträge für diesen Benutzer in der 'allowed_scripts' Tabelle. – halfer

+0

Wenn Sie mit der Idee von 1000 Skripten fortfahren, werden Sie am Ende die Grenzen der Zeilengröße überschreiten, wenn Sie nicht mit der Normalisierung beginnen, denke ich. –

+0

Werfen Sie einen Blick auf @ [Ist das Speichern einer begrenzten Liste in einer Datenbankspalte wirklich so schlimm?] (Http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column -really-that-bad) –

Antwort

6

1000 Zeilen sind nicht viel (im gleichen Licht, noch ist 10.000.000), die Normalisierung Ihrer Datenbank (dh Benutzer zu Skripten) ist perfekt dafür geeignet. Wenn Sie eine Zeichenfolge verketten, außer Sie verwenden TEXT (was sowieso baaaaad ist!), Werden Sie wahrscheinlich eine Form der Feldlängenbeschränkung treffen, bevor Sie zu viele Skript-IDs hinzufügen können.

Also ja, ich würde auch vorschlagen, dass Ihre normalisieren in diesem Ausmaß:

Script

script_id 
name 

User

user_id 
... 

User_Script

user_script_id 
user_id 
script_id 

Visualisation

.. dann wird jede Beziehung in User_Script gehen.

Dies ist viel sauberer als Verketten einer Zeichenfolge, und beim Löschen Suche/Ersetzen von einer Zeichenfolge. Es wird schneller, sauberer und hilft Ihnen dabei, Ihre Datenbank viel besser zu sehen.

Wie würden Sie derzeit alle Skriptnamen aus der Datenbank bekommen? Mit dem obigen etwas normalisierten Design können Sie diese Abfrage ähnlich wie folgt ausführen:

SELECT `user`.`first_name`, `script.name` FROM `User_Script` 
INNER JOIN `Script` USING (`script_id`) 
INNER JOIN `User` USING (`user_id`) 
+0

1000-Benutzer? Wenn also jedes System 10 bis 100 Benutzer hat, multiplizieren Sie einfach die Rechte wie 1000x100 ... –

+0

@RandomGuy Korrigieren. Das ist nicht viel. –

+0

Was passiert, wenn ich alle Skript-IDs mit einem Trennzeichen in einem einzigen Feld abspeichere? –

2

Ich würde diese Daten normalisieren, ja. Eine dritte Tabelle, die Benutzer mit Skripten verbindet, sollten Sie tun.

Wenn ein Benutzer Zugriff auf 1000 Skripts hat, bedeutet das sicher 1000 Einträge in dieser neuen dritten Tabelle, aber das ist in Ordnung. Sie werden feststellen, dass die Daten einfacher zu verwalten sind, und wenn, wie Sie sagen, ein Skript entfernt wird, ist es auch trivial, seinen Eintrag in dieser dritten Tabelle zu entfernen, ohne auf umständliche Teilstring-Routinen in einem abgegrenzten Feld zurückgreifen zu müssen Benutzer Tabelle.

Machen Sie sich keine Gedanken über die Anzahl der Zeilen, die in der neuen Tabelle erzeugt werden. MySQL kann mühelos Millionen von Zeilen in einer Tabelle verarbeiten, und wenn Sie anständige Indizes erstellen, können Sie diese verknüpfen 3 Tabellen extrem schnell, wahrscheinlich schneller als Teilstring Matches, wie Sie jetzt tun müssen.

+0

Aber das wird sicherlich in ein Durcheinander enden, oder? –

+1

@RandomGuy - Sind nicht 1.000 Skripte in einem einzigen Datensatz ein größeres Durcheinander? –

+0

Nein, es wird nicht zu einem Chaos führen, sondern ist das bevorzugte Muster für diese Art von Datenmodell. Zum Beispiel würde die Abfrage nach allen Skripten, die ein Benutzer ausführen kann, wie folgt aussehen: SELECT * FROM Skripte s LINKE VERBINDUNG erlaubte_Skripte a ON a.scriptid = s.scriptid WHERE a.userid = 12345 –

0

Sie könnten ein Statusbit verwenden, um den Zugriff für die Verwendung anzugeben. Auf diese Weise werden Sie immer den Vorteil, einen schnellen Zugriff mit einem Index von einzigartigen Skript-ID und für updation alle dauert es ein Zurücksetzen Ihres boolean Bit

Zum Beispiel

user access 
    script_id user_id isGranted 
    ---------------------------- 
    21345  some_user_id yes 

Und Ihre ursprüngliche Idee mit einem String und sichtet es für möglich, Skripte zu denen der Benutzer hat Zugriff auf ineffizient sein könnte, wenn man ständig geben hat oder Zugang zu einem Skript auf die Vorlieben des Benutzers

betrachten diesen

12|34|45|56| 
Basis nehmen

Was ist, wenn Sie den Zugriff auf Skript 56 wiederholt gewähren oder entziehen müssen. . . .Sie können keine Strings für diese repetitive Aktion abrufen und verarbeiten, was unnötig und ineffizient ist. In diesem Fall hilft das Setzen eines booleschen Bits und speichert viele Verarbeitungsprobleme.

Verwandte Themen