Zunächst eine allgemeine Frage

Sophus

SQL-Guru
Beiträge
135
Hallo Leute,

kurz zu meinem Vorhaben. Ich bin dabei ein kleines Projekt zu schreiben - ein Verwaltungssystem. Mit meinem Projekt möchte ich darauf hinaus, dass es möglich sei, dass ich mich entscheiden kann, ob ich mit der Anwendung auf meinen MySQL, PostGreSQL-Server zugreifen möchte oder eher mit lokalen Datenbanken wie MS Access oder SQLite arbeiten möchte. Vor diesem Hintergrund möchte ich natürlich eine "generelle" Modellierung anfertigen. Was kann man mit meinem Projekt so alles speichern? Ich möchte darauf hinaus, dass ich Informationen über Filme, Serien, Alben, Singles, Schallplatten, Videosspiele, Kontaktdaten, Briefmarken etc speichern kann. Es wird also ein groß angelegtes Projekt. Ich modelliere zur Zeit mit dem Programm namens Toad Data Modeler 5.2.

Vor diesem Hintergrund wollte ich euch fragen, ob ich hier im Forum richtig bin, wenn ich bei und während meiner Modellierung stets an euch wenden kann, um so eure Meinung einholen zu können? Oder ist diese Forum-Gemeinde eher darauf ausgelegt abstrakte Fragestellungen zu beantworten bzw. abstrakte Antworten zu formulieren und das möglichst "selten" wie möglich. Denn bei meinem Vorhaben ist es durchaus wahrscheinlich, dass ich mich des öfteren an euch wenden würde.

Es grüßt euch
Sophus
 
Werbung:
Hi Sophus,

Fragen werden hier nach bestem Wissen beantwortet. Es spielt keine Rolle ob die Frage abstrakt oder konkret ist. Konkrete Probleme sind für gewöhnlich aber leichter zu lösen als abstrakte. ;)

Wenn du auch mal ein paar Stunden auf die Antwort warten kannst, sollte es kein Problem sein dich bei deinem Projekt zu begleiten. Welche Software du verwendest ist im Grunde egal. Zumindest solange du keinen Support für die Software erwartest.

Gruß
Hony
 
Ich bin dabei ein kleines Projekt zu schreiben - ein Verwaltungssystem. Mit meinem Projekt möchte ich darauf hinaus, dass es möglich sei, dass ich mich entscheiden kann, ob ich mit der Anwendung auf meinen MySQL, PostGreSQL-Server zugreifen möchte oder eher mit lokalen Datenbanken wie MS Access oder SQLite arbeiten möchte. Vor diesem Hintergrund möchte ich natürlich eine "generelle" Modellierung anfertigen.

Die Idee ist so gut wie auch gefährlich. Wenn Deine Applikation auf N Plattformen laufen soll, so bist Du gezwungen, Dich am 'Kleinsten gemeinsammen Nenner' dieser N Systeme zu orientieren.

Mal so paar Beispiele:

  • angenommen, Du willst in mehreren Tabellen eine ID verwenden, die über alle Tabellen Unique ist. In z.B. PostgreSQL einfach via einer Sequence, in MySQL müßtest Du das in eine extra Tabelle auslagern, die Du bei Bedarf sperrst und nimmst MyISAM, weil das ist schön schnell. Machst Du das aber in PG wird es unerträglich lahm (bzw. erheblich lahmer als in MySQL), weil Sperren in PG erheblich teurer sind.
  • In MySQL kannst Du dieses Konstrukt 'Insert or Replace' verwenden (genaue Syntax kenne ich nicht) - das geht wiederum in PG (noch) nicht. Du wirst drauf verzichten müssen.
  • Check-Constraints versteht MySQL zwar, beachtet sie aber nicht. Du wirst drauf verzichten müssen.
  • PG kennt viele Datentypen wie z.B. Ranges, die anderen nicht - Du wirst drauf verzichten müssen.

Du solltest Dir also auch mal anschauen, was die Datenbanken im einzelnen so können (nehme Dir viel Zeit für PG, das kann sehr viel...) und dann prüfen, was Du brauchst und was welche Systeme können.
 
PG kennt viele Datentypen wie z.B. Ranges, die anderen nicht - Du wirst drauf verzichten müssen.

Das finde ich jetzt ehrlich gesagt nicht allzu schlimm. Ranges lassen sich problemlos durch zwei Felder ersetzen. Außerdem verletzen Ranges streng genommen die 1. NF, da sich ein Wertebereich immer über die beiden Extreme definiert und damit nicht mehr Atomar ist.

Ansonsten stimmt es natürlich, dass MySQL den Standard setzen dürfte, da es im Vergleich mit allen anderen relevanten DBMS die geringste Funktionsvielfalt besitzt.
 
Entweder meinst du gerade etwas anderes als ich

Vermutlich. Ich zeig es mal:

Code:
test=# create table int_range_test(id int, i_range int4range, exclude using gist(id with =, i_range with &&))  ;
CREATE TABLE
test=*# insert into int_range_test values (1, '[1,5)');
INSERT 0 1
test=*# insert into int_range_test values (2, '[5,9)');
INSERT 0 1
test=*# select * from int_range_test ;
 id | i_range
----+---------
  1 | [1,5)
  2 | [5,9)
(2 rows)

test=*# insert into int_range_test values (3, '(9,10]');
INSERT 0 1
test=*# select * from int_range_test ;
 id | i_range
----+---------
  1 | [1,5)
  2 | [5,9)
  3 | [10,11)
(3 rows)

test=*# insert into int_range_test values (2, '[7,13)');
ERROR:  conflicting key value violates exclusion constraint "int_range_test_id_i_range_excl"
DETAIL:  Key (id, i_range)=(2, [7,13)) conflicts with existing key (id, i_range)=(2, [5,9)).
STATEMENT:  insert into int_range_test values (2, '[7,13)');
ERROR:  conflicting key value violates exclusion constraint "int_range_test_id_i_range_excl"
DETAIL:  Key (id, i_range)=(2, [7,13)) conflicts with existing key (id, i_range)=(2, [5,9)).
test=*#

Insbesondere den Exclusion Constraint wirst Du schwer nachmachen können ...
 
Hallo Leute,

dann bin ich hier genau richtig. Und auf Antworten kann ich gut warten, denn ich habe nicht vor Berlin oder Rom in 5 Minuten zu bauen. Ihr wisst was ich meine :) Mir geht es eher darum, dass ich bei meiner Modellierung mehrere Meinungen bräuchte. Und eure Anmerkungen zu den Datenbanken wie PostGreSQL und MySQL könnten wir gern während der Modellierung an entsprechenden Stellen vertiefen. Zunächst geht es mir erst einmal darum, dass am Ende des Tages die Datenbank gründlichst modelliert steht.

Kann man hier im Forum Bilder hochladen? Einige Foren bieten ja solch einen Service an, dass man die Bilder nicht erst auf fremde Upload-Server hochladen musst. Mir geht es darum, dass ich sehr visuell veranlagt bin, und meine Modellierung gerne grafisch darstellen möchte.
 
Insbesondere den Exclusion Constraint wirst Du schwer nachmachen können ...
Mal sehen ob ich das richtig interpretiere. Durch den Constraint verhinderst du, dass es zwei Datensätze mit gleicher id (nicht unique) gibt deren i_range sich überschneidet? Das wäre tatsächlich eine Herausforderung. ;)

Kann man hier im Forum Bilder hochladen?
Du kannst unter »weitere Einstellungen« Anhänge bis 1mb hoch laden. Darunter sind auch Bilder erlaubt.
 
Durch den Constraint verhinderst du, dass es zwei Datensätze mit gleicher id (nicht unique) gibt deren i_range sich überschneidet?

Jupp.

  • Terminplan: man kann nicht gleichzeitig an 2 Orten sein
  • Planung von Ressourcen: ein Hotelzimmer sollte nicht mehrfach gebucht sein, das Auto der Autovermietung ebenfalls nicht

Ich dachte, Du würdest das schon kennen ...
 
Werbung:
@akretschmer
Zum Thema Nachbau:
Code:
sqlite> SELECT * FROM rangeerror;
1|1|5
2|5|9
3|10|11

sqlite> INSERT INTO rangeerror VALUES( 2, 7, 13);
Error: Range Constraint violated.

Code:
CREATE TRIGGER exclusion INSERT ON rangeerror
WHEN
CASE
  WHEN  EXISTS (
  SELECT id
  FROM rangeerror
  WHERE id = new.id
  AND range2 > new.range1
  )
  THEN RAISE (FAIL, 'Range Constraint violated.')
END
BEGIN
  INSERT INTO rangeerror VALUES(new.id, new.range1, new.range2);
END;

Da steckt mit Sicherheit noch Verbesserungspotential drin. Aber für einen schnellen ersten Versuch finde ich das nicht schlecht. Die Fehlermeldung lässt natürlich auch zu wünschen übrig. Allerdings hallte ich es für Denkbar auch da was Ansehnliches zu produzieren. Und ja, die Methode ist deutlich umständlicher als deine. ;)

@Sophus
Sorry, dass ich deinen Thread gekapert habe.
 
Zurück
Oben