Autor Zpráva
Kos112567
Profil
Ahoj,

mám takový problém s dědičností tabulek - mám 4 tabulky (Item, Potion, Armor, Weapon) a chtěl bych, aby Item byl rodič tabulek Potion Armor a Weapon.

Vytvořil jsem ty tabulky pomocí dotazů takto:

CREATE TABLE "Item"
(
  itemid integer NOT NULL,
  name character varying,
  value integer,
  description character varying(300),
  icon character varying(200),
  type integer,
  CONSTRAINT item_pkey PRIMARY KEY (itemid)
)

A teď nevím úplně, jak napsal dotaz na ty zbylé tři tabulky tak, aby dědili sloupce z té první.

Také na otázku "jak se přesně bude chovat do dědění" si nějak neumím přesně odpovědět. Pokud vše budu mít v pořádku vytvořeno a pak přidám nějaký záznam např. do tabulky Weapon, tak by se mi tentýž záznam měl objevit i v rodičovské tabulce Item...?
Keeehi
Profil
Žádné dědění, pokud je mi známo, v databázích neexistuje.

Tvůj případ bych vytvořil tak, že bych do tabulky item přidal sloupec, který by nabýval hodnot Potion, Armor nebo Weapon.
Kos112567
Profil
Mám to takto nadefinované v konceptuálním a logickém schématu (viz printscreen).

Reálně to teda nelze udělat tak, že bych měl 4 tabulky, které by měly vlastnosti viz výše?
Keeehi
Profil
OK, v tomto případě lehce jinak.

Tabulka Item má atributy společné pro všechny tři ostatní tabulky. Ostatní tabulky mají jen ty, které jim oproti tabulce Item chybějí.

Data by jsi v databázích neměl duplikovat. Tedy možné to je, ale používá se to pro zvýšení výkonu a musíš u toho vědět, co a proč děláš.
juriad
Profil
Způsoby jak modelovat dědičnost objektů v databázi jsou popsané ve specifikaci JPA en.wikibooks.org/wiki/Java_Persistence/Inheritance. Je to sice pro Javu, ale když si odmyslíš to mapování mezi Javovými třídami a tabulkami, tak je to obecně platné.
Velice podobná věc je pak v PHP frameworku Doctrine docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html
M4n
Profil *
Tady by možná stálo za to zmínit, že relační databázový model je sice asi nejpoužívanější, ale určitě ne jediný. Existují i objektově orientované databáze, kde dědičnost funguje nativně.

V praxi se tento problém řeší většinou nějakou vrstvou pro Objektově–Relační Mapování (ORM), například zmiňovaný Doctrine.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: