Erstellen von Surrogatschlüssel und Nutzung der derselben

SQuaehLer

Neuer Benutzer
Beiträge
4
hallo miteinander

Ich habe eine Datenbank, die Texte verwaltet. Es gibt physische Texte, bspw. in Büchern, und virtuelle Texte, womit digitalisierte Texte wie Websites gemeint sind.

  • Beide Arten von Texten teilen dieselben Attribute wie Autor, Titel, Umfang etc. TextID=primary key
  • Von physischen Texten kann es mehrere Exemplare geben, darum habe ich hier ein zusätzliches Attribut ExemplarNr.
  • Ich habe physische und virtuelle Texte folgendermassen gestaltet: Eine Entinität "Texte" mit allen gemeinsamen Attributen und 2 Eninitäten "physischeTexte" sowie "virtuelleTexte", die von "Texte" erben.
  • Um die Tupel aus "physischeTexte" anzusprechen, habe ich einen Surrogatschlüssel vorgesehen, der aus TextID und ExemplarNr besteht.
Nun zu meinen Fragen:
  1. Wie muss ich in "physischeTexte" und "virtuelleTexte" seitens SQL die Vererbung angeben?
  2. "virtuelleTexte" benötigt eigentlich keine ExemplarNr, da sie virtuell sind und damit sowieso beliebig oft kopiert werden können. Für "virtuelleTexte" gibt es also eigentlich nur den primary key "TextID", kein Surrogatschlüssel wie bei "physischeTexte". Ich möchte aber beide Gruppen gleich ansprechen. Geht das überhaupt oder scheitert es daran, dass sich der Schlüssel nicht gleich zusammensetzt? Kann ich das vielleicht umgehen, indem ich "ExemplarNr" auch für "virtuelleTexte" übernehme und per default irgendeinen Wert setze?

Ich nutze Visual Studio Code mit SQLite extension.

Ich hoffe es liest sich nicht so kompliziert wie es sich in meinem Kopf gerade anfühlt ;-)

Vielen Dank für jede Hilfen und jeden Tipp!

Liebe Grüsse aus der Schweiz,
Markus
 
Werbung:
Du hast das mit der Vererbung schon erkannt, es macht nicht viel Sinn in SQL. (Es gibt Systeme, die das -teilweise- können)
Du kannst mit einem Flagfeld arbeiten, um eine Merkmalsvariante darzustelllen.
 
Code:
edb=# create table texte(id serial primary key, autor text);
CREATE TABLE
edb=*# create table p_texte (exemplar int) inherits ( texte);
CREATE TABLE
edb=*# create table v_texte () inherits ( texte);
CREATE TABLE
edb=*# insert into v_texte (autor) values ('Max');
INSERT 0 1
edb=*# insert into p_texte (autor, exemplar) values ('Susi',1);
INSERT 0 1
edb=*# select * from texte;
 id | autor
----+-------
  2 | Susi
  1 | Max
(2 rows)
edb=*# select *,tableoid::regclass::text AS table_name from texte;
 id | autor | table_name
----+-------+------------
  2 | Susi  | p_texte
  1 | Max   | v_texte
(2 rows)
edb=*# select *, (select exemplar from p_texte p where p.id=texte.id) from texte;
 id | autor | exemplar
----+-------+----------
  2 | Susi  |        1
  1 | Max   |         
(2 rows)

ist aber kein SQLite...
 
Werbung:
@dabadepdu & akretschmer:
Vielen Dank für Eure Hinweise. Ich werde in den sauren Apfel beissen und "physischeTexte" und "virtuelleTexte" als 2 verschiedene Klassen ansprechen.
Für ne Umstellung auf was anderes als SQlite ist's leider zu spät, Abgabe ist am Sonntag ;-)
 
Zurück
Oben