Probleme mit Umsetzung einer is-a-Beziehung

para_noid

hirnrissig
Folgende Tabellen:

SQL:
CREATE TABLE character_item (
    id integer NOT NULL,
    characterid integer NOT NULL,
    itemid integer NOT NULL,
    amount smallint DEFAULT 1 NOT NULL
);

CREATE TABLE item (
    id integer NOT NULL,
    name character varying(125) NOT NULL,
    description text NOT NULL,
    price integer NOT NULL
);

CREATE TABLE object (
    id integer NOT NULL
);

CREATE TABLE equipment (
    id integer NOT NULL,
    materialid integer
);
(weiß auch nicht wieso die ganzen Keys beim Export nicht mitkommen, sie sind aber definitiv vorhanden)

Tabellen object & equipment stehen in is-a-Beziehung zur Tabelle item. Das eine sind sonstige Gegenstände (meinetwegen Verband), das andere ist Ausrüstung (Lederstiefel). An sich handelt es sich ja hierbei jeweils um 1:1-Beziehungen, ein item ist entweder ein Ausrüstungsgegenstand oder ein sonstiger Gegenstand. Demzufolge müsste der Primary Key von den beiden Kindtabellen dem der Elterntabelle entsprechen.
Die Gegenstände, die ein Spieler gesammelt hat, stehen in character_item.

Was ich mich jetzt frage: wie finde ich bei dieser Konstellation ausgehend von der Tabelle character_item heraus, um welche Spezialisierung es sich handelt? Ich möchte zum Beispiel alle Items des Spielers und ihre relevanten Informationen auflisten - bei Ausrüstungsgegenständen eben auch das Material. Zu beiden Kindtabellen werden noch Zwischentabellen folgen, die dauerhafte (Ausrüstung) oder zeitlich begrenzte (sonstige) Steigerungen von Spielerfähigkeiten beinhalten.

Ich seh hier momentan nur zwei Möglichkeiten:
  1. ich selektiere character_skill.itemid -> item.id -> equipment.id und wenn ich kein Ergebnis bekomme object.id, also frei nach trial&error
  2. ich erweitere Tabelle item um die Spalte typ(enum) und je nachdem, welcher Wert da drin steht, selektiere ich equipment oder object

Beide Varianten find ich ziemlich hässlich. Außerdem beschleicht mich das dumpfe Gefühl, in der Theorie irgendetwas fürchterlich missverstanden zu haben oder einfach grundlos gegen ne Wand zu rennen. Hat jemand Vorschläge zur Umsetzung?
 
Zuletzt bearbeitet von einem Moderator:
irgendwie verstehe ich deine Frage nicht. Was willst du genau?

Mach doch mal ein Beispiel mit Beispieldaten
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
Code:
character_item
id | characterid | itemid | amount
---------------------------------------
1       1             1       1
2       1             2       1
3       1             4       10


item
id | name        | description | price
-----------------------------------
1   Lederstiefel text          120
2   Stahlhelm    text         180
4   Verband      text          20


equipment
id | materialid
-----------------
1       1
2       2


object
id
------
4

Ergebis:
Code:
itemid | name      | materialid | description | amount
----------------------------------------------------------
1      Lederstiefel    1         text           1
2      Stahlhelm       2         text           1
4      Verband         -         text           10

Ich suche einfach den besten Weg, etwaige Zusatzinformationen anhand des Itemtyps abzurufen, ohne mich eben mit den unschönen geposteten Varianten behelfen zu müssen.
 
Mit LEFT JOIN

ungetestetes Beispiel für MySQL
SQL:
SELECT
	ci.itemid,
	i.name,
	e.materialid,
	i.description,
	ci.amount
FROM
	character_item AS ci
	LEFT JOIN item AS i
		ON ci.itemid = i.id
	LEFT JOIN equipment AS e
		ON e.id = i.id
	-- Die Tabelle object wird hier eigentlich nicht gebraucht
	LEFT JOIN object AS o
		ON o.id = i.id
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ich glaube mein Denkfehler wird mir langsam klar. Wenn ich später weitere Tabellen in Abhänigkeit von equipment & objects joinen möchte, lässt sich das ja genauso mit LEFT JOINs erledigen.

Danke.
 

Neue Beiträge

Zurück