JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=971442155d7144ade842dc9816d3e883Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Constraints

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 10.07.2009, 11:29    Titel: Constraints Antworten mit Zitat

Hallo an alle SQL-Kundigen:

Ich habe ein kleines Designproblem, bei dem mir hoffentlich jemand helfen kann:

Ich habe 3 Tabellen (auf das wesentliche Reduziert) welche in Abhängigkeit miteinander stehen sollen.
Die Tabellen sollen 3D-Modelldaten speichern.

Tabelle 1: Meshes mit MeshId und MeshName
Tabelle 2: Vertices mit VertexId, MeshId und 3 Koordinaten x, y und z
Tabelle 3: Indices mit IndexId, MeshId und 3 Vertices v1, v2 und v3

So weit so gut.
Die Tabellen bekommen Primärschlüssel, damit SQL-Operationen zügig funktionieren, Meshes bekommt zudem noch die Einschränkung, dass der MeshName eindeutig sein muss.

Zudem werden in den Tabellen Vertices und Indices Fremdschlüssel auf Meshes definiert, so dass Ein Vertex oder ein Index automatisch einem Mesh zugeordnet ist.

Jetzt das Problem:

Ich möchte ausserdem noch jedem Indexeintrag mit Fremdschlüssel für die Vertices in Abhängigkeit des passenden Meshes definieren.
Also für ein Mesh 1 mit Vertex 1, 2 und 3 soll in der IndexTabelle ein Dreieck über genau diese 3 Vertices definiert werden.
Es darf eben nicht dazu kommen, dass ein Dreieck auf Mesh1 mit Vertices von Mesh1 und Mesh2 definiert wird.
Kann ich diese Bedingung im Datenmodell überhaupt hinterlegen?

Die Tabellen werden bisher so definiert:
Code:

CREATE TABLE
   [Meshes]
(
   [MeshId] [int] NOT NULL,
   [MeshName] [nvarchar](100) NOT NULL,
   CONSTRAINT [PK_Meshes] PRIMARY KEY CLUSTERED
   (
      [MeshId] ASC
   ),
   CONSTRAINT [IX_Meshes] UNIQUE NONCLUSTERED
   (
      [MeshName] ASC
   )
);

CREATE TABLE
   [Vertices]
(
   [VertexId] [int] NOT NULL,
   [MeshId] [int] NOT NULL,
   [x] [float] NOT NULL,
   [y] [float] NOT NULL,
   [z] [float] NOT NULL,
   CONSTRAINT [PK_Vertices] PRIMARY KEY CLUSTERED
   (
      [VertexId] ASC,
      [MeshId] ASC
   ),
   CONSTRAINT [FK_Vertices_Meshes] FOREIGN KEY
      ( [MeshId] ) REFERENCES [Meshes] ( [MeshId] )
);

CREATE TABLE
   [Indices]
(
   [IndexId] [int] NOT NULL,
   [MeshId] [int] NOT NULL,
   [v1] [int] NOT NULL,
   [v2] [int] NOT NULL,
   [v3] [int] NOT NULL,
   CONSTRAINT [PK_Indices] PRIMARY KEY CLUSTERED
   (
      [IndexId] ASC,
      [MeshId] ASC
   ),
   CONSTRAINT [FK_Indices_Meshes] FOREIGN KEY
      ( [MeshId] ) REFERENCES [Meshes] ( [MeshId] )
);



Es Fehlen also 3 Bedingungen an Tabelle Indices - je eine für v1, v2 und v3

v1 darf nur aus den VertexId's bestehen, welche zum gleichen Mesh gehören wie der Index
analog für v2 und v3

Eine weitere Bedingung für später wäre vielleicht noch, dass v1, v2 und v3 nicht den selben Wert haben dürfen, aber das verschiebe ich erst einmal nach hinten.

Any Idea?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 41
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 10.07.2009, 15:29    Titel: Antworten mit Zitat

Du könntest die Überprüfung möglicherweise per Trigger erledigen.

Zitat:
Triggers

A trigger defines a set of actions that is activated by an operation that modifies the data in a specified base table.

You can use triggers to perform validation of input data, to automatically generate a value for a newly inserted tuple, to read from other tables for cross-referencing purposes, or to write to other tables for audit-trail purposes.


Siehe: DB2 Constraints

Zitat:
Eine weitere Bedingung für später wäre vielleicht noch, dass v1, v2 und v3 nicht den selben Wert haben dürfen, aber das verschiebe ich erst einmal nach hinten.


Die DB2 hat dafür zB einen CHECK-Constraint. MySQL bietet das afaik nicht.
Code:

CREATE TABLE EMP
           (ID           SMALLINT NOT NULL,
            NAME         VARCHAR(9),
            DEPT         SMALLINT CHECK (DEPT BETWEEN 10 AND 100),
            JOB          CHAR(5)   CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),
            HIREDATE     DATE,
            SALARY       DECIMAL(7,2),
            COMM         DECIMAL(7,2),
            PRIMARY KEY (ID),
            CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500) )

_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 13.07.2009, 10:46    Titel: Antworten mit Zitat

Ich habe das Problem (v1, v2 und v3) lösen können, indem ich ein Fremdschlüssel-Eintrag für beide Spalten Parallel angelegt habe, also

Code:

CREATE TABLE
   [Indices]
(
   [IndexId] [int] NOT NULL,
   [MeshId] [int] NOT NULL,
   [v1] [int] NOT NULL,
   [v2] [int] NOT NULL,
   [v3] [int] NOT NULL,
   CONSTRAINT [PK_Indices] PRIMARY KEY CLUSTERED
   (
      [IndexId] ASC,
      [MeshId] ASC
   ),
   CONSTRAINT [FK_Indices_Meshes] FOREIGN KEY
      ( [MeshId] ) REFERENCES [Meshes] ( [MeshId] ),
   CONSTRAINT [FK_Indices_Vertices_v1] FOREIGN KEY
      ( [v1], [MeshId] ) REFERENCES [Vertices] ( [VertexId], [MeshId] ),
   CONSTRAINT [FK_Indices_Vertices_v2] FOREIGN KEY
      ( [v2], [MeshId] ) REFERENCES [Vertices] ( [VertexId], [MeshId] ),
   CONSTRAINT [FK_Indices_Vertices_v3] FOREIGN KEY
      ( [v3], [MeshId] ) REFERENCES [Vertices] ( [VertexId], [MeshId] )
);


Allerdings musste ich feststellen, dass das Entity Framework nicht mit derartigen FK's umgehen kann, weswegen ich den Kompletten Ansatz überarbeiten muss Sad
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum