Zusammenfassend: Du hast zwischen Objekten und Eigenschaften eine N:M
Beziehung. Im Datenmodell wird sowas durch die Verwendung einer
eigenen Relationstabelle modelliert.
Der Einfachheit halber ein Beispiel mit Personen inklusive physischem
Datenbankdesign (ich beschränke mich hier auf Oracle, da ich das am
besten kenne, Indize und Constraints nicht betrachtet).
Tabelle Personen:
CREATE TABLE Pers(
object_id INTEGER, /* man braucht immer eine ID */
object_name VARCHAR2(100), /* Name */
object_fname VARCHAR2(100) /* Vorname */
);
object_id INTEGER, /* man braucht immer eine ID */
object_name VARCHAR2(100), /* Name */
object_fname VARCHAR2(100) /* Vorname */
);
Tabelle Eigenschaften
CREATE TABLE atrb (
atrb_id INTEGER, /* ID */
atribute VARCHAR2(100) /* Name */
);
atrb_id INTEGER, /* ID */
atribute VARCHAR2(100) /* Name */
);
Tabelle Personeneigenschaften
CREATE TABLE atrb_val (
object_id INTEGER, /* Personen ID */
atrb_id INTEGER, /* Eigenschaft ID */
atrb_val VARCHAR2(100) /* Ausprägung */
);
object_id INTEGER, /* Personen ID */
atrb_id INTEGER, /* Eigenschaft ID */
atrb_val VARCHAR2(100) /* Ausprägung */
);
In dieser Tabelle werden nur die eingegebenen Eigenschaften
gespeichert. Also alles, was du an Beziehungen vorliegen hast. Alles
was nicht relevant ist, kann später per SQL generiert werden.
Nun füllen wir mal unsere Beispieltabellen:
/* Zunächst brauchen wir ein paar Personen */
INSERT INTO pers VALUES (1, 'schulz', 'mike' );
INSERT INTO pers VALUES (2, 'müller', 'otto' );
INSERT INTO pers VALUES (3, 'schmidt', 'oliver' );
/* Nun noch ein paar passende Eigenschaften */
INSERT INTO atrb VALUES (1, 'größe');
INSERT INTO atrb VALUES (2, 'gewicht');
INSERT INTO atrb VALUES (3, 'brille');
/* Und hier jetzt die Zuordnungen Person zu Eigenschaft */
INSERT INTO atrb_val VALUES (1, 1, '1.8m');
INSERT INTO atrb_val VALUES (1, 2, '75kg');
INSERT INTO atrb_val VALUES (2, 1, '2m');
INSERT INTO atrb_val VALUES (2, 3, 'y');
Nun können wir schön eine Beziehung darstellen. Also alle eingegebenen
Atribute zu den Objekten anzeigen lassen:
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE,
c.atrb_val
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
OBJECT_NAME OBJECT_FNAME ATRIBUTE ATRB_VAL mike schulz größe 1.8m mike schulz gewicht 75kg otto müller größe 2m otto müller brille y
Ok, soweit warst Du vermutlich schon. Aber wir können daraus auch die
Werte ziehen, die dort gar nicht enthalten sind.
Dies geschieht, indem alle vorhandenen Kombination von allen möglichen
Kombination abgezogen werden. Es handelt sich hierbei also um die
Differenz zweier Mengen.
-- Alle möglichen Kombinationen aus Person und Attributen
SELECT
a.object_fname,
a.object_name,
b.atribute
FROM
pers a,
atrb b
-- von dieser Menge ziehen wir ab
MINUS
-- Alle vorhandenen Kombinationen aus Person und Attributen
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
Als Ergebnis erhalten wir:
OBJECT_FNAME OBJECT_NAME ATRIBUTE mike schulz brille oliver schmidt brille oliver schmidt gewicht oliver schmidt größe otto müller gewicht
Damit hast du also alle Kombinationen, die für dich nicht relevant
sind. Wenn Du diese Ergebnismenge nimmst und mit der Menge aller
vorhandenen Kombinationen kombinierst, hast Du Dein gewünschtes
Ergebnis, nämlich alle vorhandenen Eigenschaften inklusive aller nicht
angegebenen Eigenschaften:
SELECT
a.object_fname,
a.object_name,
a.atribute,
'----' as atrb_val
FROM
(
SELECT
a.object_fname,
a.object_name,
b.atribute
FROM
pers a,
atrb b
MINUS
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id
) a
UNION
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE,
c.atrb_val
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
OBJECT_FNAME OBJECT_NAME ATRIBUTE ATRB_VAL mike schulz brille ---- mike schulz gewicht 75kg mike schulz größe 1.8m oliver schmidt brille ---- oliver schmidt gewicht ---- oliver schmidt größe ---- otto müller brille y otto müller gewicht ---- otto müller größe 2mUnd dies wäre dann dein gewünschter Report.
Das ist alles größtenteils aus dem Ärmel geschüttelt und ungetestet,
das Prinzip sollte klar werden.
