|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 10.07.2009, 11:29 Titel: Constraints |
|
|
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 |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 10.07.2009, 15:29 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 13.07.2009, 10:46 Titel: |
|
|
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 _________________
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 |
|
|
|
|
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
|