Bit-Operatoren vs. Normalisierung

Bit-Operatoren vs. Normalisierung

am 12.10.2006 11:04:11 von Guido Schmidt

Hallo,

Ein zu speichernder Datensatz für ein Produkt enthält folgende=20
Informationen:
- Artnr
- Produktname
- Zustand Etikett

Zustand Etikett kann dabei 0-n von n vordefinierten Werten annehmen=20
(z.B. schmutzig, verblasst, wellig) .

Normalisiert würde ich das in einer Datenbankstruktur wie folgt speiche=
rn:

CREATE TABLE produkte (
artnr int(3) unsigned NOT NULL,
produktname varchar(200) NOT NULL,
PRIMARY KEY (artnr)
) ENGINE=3DInnoDB;

CREATE TABLE produkte_etikett_eigenschaften (
artnr int(3) unsigned NOT NULL,
eigenschaft_id int(1) unsigned NOT NULL,
KEY artnr (artnr),
KEY eigenschaft_id (eigenschaft_id),
FOREIGN KEY (artnr) REFERENCES produkte (art)
ON DELETE UPDATE ON UPDATE CASCADE,
FOREIGN KEY (eigenschaft_id) REFERENCES etikett_eigenschaften
(eigenschaften) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=3DInnoDB;

CREATE TABLE etikett_eigenschaften (
eigenschaft_id int(1) unsigned NOT NULL,
eigenschaft_name varchar(200) NOT NULL,
PRIMARY KEY (eigenschaft_id)
) ENGINE=3DInnoDB;

Die Tabelle produkte_etikett_eigenschaften könnte ich mir aber auch=20
sparen, indem ich in Tabelle etikett_eigenschaften für eigenschaft_id=20
nur Potenzen von 2 verwende und der Tabelle produkte ein zusätzliches=20
Feld für die etikett_eigenschaften hinzufüge, in dem ich die Summe vo=
n=20
eigenschaft_id speichere. Mit Bit-Operatoren lassen sich Suchen und=20
Verknüpfungen mit etikett_eigenschaften problemlos erledigen.
Was sind ggf. Nachteile?

Guido

Re: Bit-Operatoren vs. Normalisierung

am 12.10.2006 13:08:46 von Axel Schwenke

Guido Schmidt wrote:

> Ein zu speichernder Datensatz für ein Produkt enthält folgende
> Informationen:
> - Artnr
> - Produktname
> - Zustand Etikett
>
> Zustand Etikett kann dabei 0-n von n vordefinierten Werten annehmen
> (z.B. schmutzig, verblasst, wellig) .

Also ein SET (Menge) von Eigenschaften.

> Normalisiert würde ich das in einer Datenbankstruktur wie folgt speiche
> rn:

[snip]

Ja

> Die Tabelle produkte_etikett_eigenschaften könnte ich mir aber auch
> sparen, indem ich in Tabelle etikett_eigenschaften für eigenschaft_id
> nur Potenzen von 2 verwende und der Tabelle produkte ein zusätzliches
> Feld für die etikett_eigenschaften hinzufüge, in dem ich die Summe vo
> n
> eigenschaft_id speichere. Mit Bit-Operatoren lassen sich Suchen und
> Verknüpfungen mit etikett_eigenschaften problemlos erledigen.

Diese Denormalisierung sieht MySQL selber schon vor und stellt dafür
den SET Datentyp bereit. Damit kann man sich die manuelle Bit-Fizzelei
ersparen und bekommt auch schöne Namen für die Bits.

> Was sind ggf. Nachteile?

Die üblichen Verdächtigen für nicht-normalisierte Datenstrukturen:

- es skaliert nicht. MySQL SETs sind auf 64 Elemente beschränkt, die
Ähnlichkeit mit der Länge von BIGINT in Bits ist nicht zufällig ;-)

- bestimmte Suchvorgänge lassen sich nicht mit Indexen beschleunigen.
Beispiel: Bestimme die Anzahl der Artikel mit verknittertem Etikett


XL

Re: Bit-Operatoren vs. Normalisierung

am 12.10.2006 15:37:59 von Guido Schmidt

Axel Schwenke schrieb:

> - es skaliert nicht. MySQL SETs sind auf 64 Elemente beschränkt, die
> Ähnlichkeit mit der Länge von BIGINT in Bits ist nicht zufällig=
;-)

Ist in meinem konkreten Fall nicht relevant.

> - bestimmte Suchvorgänge lassen sich nicht mit Indexen beschleunigen.=

> Beispiel: Bestimme die Anzahl der Artikel mit verknittertem Etikett

Das ist der entscheidende Tipp.
Besten Dank für die Ausführungen!

Guido