Toon posts:

[Rel. Database] - N-dimensionale matrix

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor mijn afstudeeronderzoek moet ik een n-dimensionale matrix kunnen afbeelden naar een relationeel database ontwerp. Ik dacht, ah, dit zal vast wel ergens op google staan, maar ik kon niets vinden... Ik kwam alleen dingen tegen over multidimensionale databases.

Via de search:

[rml][ mySQL & PHP] Matrix opslaan in DB[/rml]

... maar dat is 2d, maar ik moet het voor een N-dimensionale oplossing hebben.

Oke, wat ik heb bedacht:

2d-matrix
x
y
value
dim_id

dimension
dim_id
z
value
next_dim_id

Stel ik moet de 3-d waarde (1,2,3)=4 afbeelden.

In 2d-matrix staat dan: x=1, y=2, dim_id=1, value=null
In dimension: dim_id=1, z=3, value=4, next_dim_id=null.

Stel, ik heb de 4-d waarde (1,2,3,4)=5

In 2d-matrix staat dan: x=1, y=2, dim_id=1, value=null
In dimension: dim_id=1, z=3, next_dim_id=2, value=null.
dim_id=2, z=4, value=5, next_dim_id=null

Ik weet niet of dit de goede manier is?

Verwijderd

Als je toch twee tabellen gebruikt waarom niet gewoon

Matrix
(Matrix_ID)
value

Matrix_Details
(Detail_ID)
(Matrix_ID)
coordinaat

En het als volgt opslaan (even afgezien van de autoinc velden
3d (1,2,3)= 4: 1 record in Matrix (4) en 3 records in Matrix_Details (1), (2), (3)
4d (1,2,3,4)=5: 1 record in Matrix (5): en 4 records Matrix_Details (1), (2), (3), (4)

Op deze manier staan al je coordinaten tenminste in dezelfde tabel en kun je ze er eenvoudig in 1 keer uithalen.

Verwijderd

Topicstarter
Hey, das wel een goede :D Ik vond mijn oplossing inderdaad niet echt mooi... Super :)

Even denken, maar hoe wil je die waarden eruit halen dan...?

In SQL:

SQL:
1
2
3
4
SELECT COUNT(*) AS aantal, Matrix_id 
    FROM Matrix_Details 
    WHERE coordinaat=1 OR coordinaat=2 OR coordinaat=3 
    HAVING aantal=3

Niet echt heel netjes als je het mij vraagt...

[ Voor 65% gewijzigd door Verwijderd op 01-03-2006 11:14 ]


  • Thekk
  • Registratie: Augustus 2002
  • Laatst online: 02-04 08:32
Ik zou gaan voor:

Matrix
Matrix_Id (PK)
Value

Matrix_Coords
Coord_Id (PK)
Matrix_Id (FK)
Dimension
Position

In Dimension sla je de dimensie op, bij position sla je de positie binnen die dimensie op. Waarde 6 op matrixpositie (5,4) geeft dan dus:
in tabel Matrix: Matrix_Id = 1, Value = 6,
in tabel Matrix_Coords: Coord_Id = 1, Matrix_Id = 1, Dimension = 1, Position = 5,
en: Coord_Id = 2, Matrix_Id = 1, Dimension = 2, Position = 4

Lekker laten draaien, die raderen! :)

[ Voor 8% gewijzigd door Thekk op 01-03-2006 11:47 ]

Ik heb geen zin om een sig te maken.


Verwijderd

Topicstarter
Ja, dat is wel iets beter, maar hoe kun je zo meerdere values bij 1 matrix opslaan...?

De raderen draaien :)

  • ILUsion
  • Registratie: Augustus 2003
  • Laatst online: 08-11-2025
Dat ontwerp van Jan Klaasen zal volgens mij niet werken omdat je per coördinaat ook de bijhorende dimensie moet opslaan zoals Thekk in zijn ontwerp wel doet. (1,2,3) is een ander punt dan (3,2,1), hetgeen in het eerste ontwerp niet te zien zou zijn maar in het tweede wel.

Meerdere waarden opslaan lijkt me ook geen probleem:
een andere entry in de tabel matrix en de bijhorende entries in matrix_coords moeten volstaan.

Just FYI:
Meerdere N-matrices maken, is met dit ontwerp echter niet mogelijk; daarvoor zijn twee mogelijkheden, naar ik zo direct kan zien:
ofwel gewoon de tabellen wat uitbreiden (extra field in de tabel Matrix (of in matrix_coords gaat dat ook, maar dat is redundanter) dat bepalend is voor de matrix, het best zelfs gekoppeld aan een extra tabel waarin je een naam kunt geven aan elke matrix én de dimensie kunt vastleggen om verdere problemen met coördinaten te voorkomen).
De andere mogelijkheid is een workaround eerder: gewoon het matrixnummer als coördinaat met index(dimension) 1 (of 0, dat is misschien iets duidelijker) te geven. Bij het ontwerp is het dus eerder aan te raden voor dat eerste te gaan.

Merk op dat in dit ontwerp (meerdere N-matrices) wat namen gewisseld zijn vermits ik deze wat duidelijker vind:

Matrices
Matrix_Id (PK)
Name
Dimension

Values
Value_Id (PK)
Matrix_Id (FK)
Value

Coords
Coord_Id (PK)
Value_Id (FK)
Dimension
Position

Volgens mij mag je de tabel Matrix bij de vorige 2 ontwerpen niet echt matrix noemen omdat je er geen matrices in opslaat maar enkel de waarden. In die ontwerpen kun je dus wel degelijk meerdere waarden in een matrix opslaan, alleen telt de gehele DB als één grote N-matrix terwijl de tabelnaam anders laat uitschijnen. In mijn ontwerp kun je in één DB meerdere N-matrices opslaan op een elegantere manier. In de andere ontwerpen is dit echter ook mogelijk, maar meer in de vorm van een extra dimensie in je gehele matrix.

Verwijderd

Topicstarter
Bedankt!! Er moeten inderdaad meerdere N-matrices worden opgeslagen, dus vandaar dat het met het eerste ontwerp was lastiger is.

Bedankt, ik ga het voorleggen aan mijn afstudeerbegeleider :) :)

Dimension in Matrices = #dimensies?? Waarom sla je dat op?

[ Voor 15% gewijzigd door Verwijderd op 01-03-2006 12:15 ]


Verwijderd

Matrices
• matrix_Id

Points
• point_Id
• point_Matrix_Id
• point_Value

Coordinates
• coordinate_Id
• coordinate_Point_Id
• coordinate_Dimension (numeriek)
• coordinate_Value


Voor (4,2.5,5) = 5.7:


Matrices: (1)
• [matrix_guid_A]


Points: (1)
• [point_guid_A]
• [matrix_guid_A]
• [5.7]


Coordinates: (3)
• [coordinate_guid_A]
• [point_guid_A]
• [1]
• [4]

• [coordinate_guid_B]
• [point_guid_A]
• [2]
• [2.5]

• [coordinate_guid_C]
• [point_guid_A]
• [3]
• [5]

edit:
Mosterd na de maaltijd ;(

[ Voor 14% gewijzigd door Verwijderd op 01-03-2006 12:19 ]


Verwijderd

Topicstarter
@vieux: Toch bedankt :)

Toch vraag ik me af hoe je dan het beste de waarde van (x,y,z,v) kan opvragen m.b.v. SQL (Het zal worden geimplementeerd op een Foxpro-databasestructuur, soort van SQL dus heb ik me laten vertellen :) )

bijv (1,2,3,4) opzoeken:

SQL:
1
2
3
4
SELECT value 
   FROM Matrices JOIN Values JOIN Coords 
   WHERE Position = 1 OR Position = 2 OR position=3 OR position=4
   HAVING Count(*) =4

Dit moet makkelijker kunnen... (die joins kloppen wellicht niet helemaal, moet nog ON bij, maar goed).

Ik moet gewoon zeker weten dat de uiteindelijke queries ook werkbaar zijn.

  • ILUsion
  • Registratie: Augustus 2003
  • Laatst online: 08-11-2025
Verwijderd schreef op woensdag 01 maart 2006 @ 12:14:
Bedankt!! Er moeten inderdaad meerdere N-matrices worden opgeslagen, dus vandaar dat het met het eerste ontwerp was lastiger is.

Bedankt, ik ga het voorleggen aan mijn afstudeerbegeleider :) :)

Dimension in Matrices = #dimensies?? Waarom sla je dat op?
Ik sla het op als een soort controle, weliswaar valt dat automatisch te doen (dimensie van matrix = max(D) - min(D) +1, waarbij D de dimensies opgeslagen in coords voor die bepaalde matrix).

Je hebt inderdaad gelijk dat het dus beter kan, het was ook maar een ontwerp van 5 minuten denken. Het idee achter die controle zat erin dat je geen punt maar een matrix (of vector) terugkrijgt als je niet voor de volledige dimensie waarden meegeeft, maar op zich zal dat geen probleem geven verder.
Verwijderd schreef op woensdag 01 maart 2006 @ 12:25:
@vieux: Toch bedankt :)

Toch vraag ik me af hoe je dan het beste de waarde van (x,y,z,v) kan opvragen m.b.v. SQL (Het zal worden geimplementeerd op een Foxpro-databasestructuur, soort van SQL dus heb ik me laten vertellen :) )

bijv (1,2,3,4) opzoeken:

SQL:
1
2
3
4
SELECT value 
   FROM Matrices JOIN Values JOIN Coords 
   WHERE Position = 1 OR Position = 2 OR position=3 OR position=4
   HAVING Count(*) =4

Dit moet makkelijker kunnen... (die joins kloppen wellicht niet helemaal, moet nog ON bij, maar goed).

Ik moet gewoon zeker weten dat de uiteindelijke queries ook werkbaar zijn.
Hier maak je weer dezelfde fout: met een gelijkaaridge querry ga je alle waarden terugkrijgen waar om het even welk coördinaat een 1, 2, 3 of 4 bevat. Dus (1,1,1,1), ... ,(1,2,3,4), ...., (4,4,4,4). Je moet die coördinaten in een AND-relatie met elkaar zetten én in AND-relatie met hun dimensie-index. Mijn SQL is te basic voor de gehele querry, maar hier het idee: WHERE ((coords.dim = a AND coords.pos = b) AND (coords.dim = c AND coords.pos = d) AND ... AND (coords.dim = y AND coords.pos=z))? Maar dan natuurlijk nog de AND-relatie om de matrix te bepalen (bij voorkeur daar dus een JOIN. Maar in feite krijg je dus een querry die bij een grotere N ook veel groter zal zijn.

Verwijderd

edit:
oeps, verkeerd gelezen, dacht over het ophalen van de volledige matrix ging. Is het niet handiger om eerst de hele matrix in te laden als verzameling objecten (matrix met values met coordinaten) en daar vervolgens waardes als functie van coordinaten uit proberen te halen?

(semi-syntax:) Matrix.getValue({1,2.6,7,-5});


Ik zou sowieso die matrices tabel niet meejoinen, maar zoiets doen:

SELECT * (het is beter om de velden expliciet te maken)
FROM Coords INNER JOIN Values ON Coords.Value_Id = Values.Value_Id
WHERE Values.Matrix_Id = @Matrix_Id

Dan heb je alle relevante data opgehaald en kun je er een O/R mapping functie overheenhalen om er een object schema van te maken.

[ Voor 70% gewijzigd door Verwijderd op 01-03-2006 13:18 ]


Verwijderd

Topicstarter
Verwijderd schreef op woensdag 01 maart 2006 @ 13:12:
Dan heb je alle relevante data opgehaald en kun je er een O/R mapping functie overheenhalen om er een object schema van te maken.
Kun je dit uitleggen :? Waarom is een O/R mapping functie nodig? Ik heb er even op gegoogled, maar zie niet hoe ik dat hier kan gebruiken... Ik vond de query van Illusion wel duidelijk eigenlijk...

@Edit: aan wat voor functies zit je te denken? Ik zit niet echt in Foxpro, dus ik denk momenteel alleen in queries.

Ben er wel uit dat het getekende schema wel implementeerbaar is, right?

[ Voor 19% gewijzigd door Verwijderd op 01-03-2006 13:18 ]


Verwijderd

Verwijderd schreef op woensdag 01 maart 2006 @ 13:17:
[...]

Kun je dit uitleggen :? Waarom is een O/R mapping functie nodig? Ik heb er even op gegoogled, maar zie niet hoe ik dat hier kan gebruiken... Ik vond de query van Illusion wel duidelijk eigenlijk...

@Edit: aan wat voor functies zit je te denken? Ik zit niet echt in Foxpro, dus ik denk momenteel alleen in queries.

Ben er wel uit dat het getekende schema wel implementeerbaar is, right?
Omdat je dan je logica naar je programmeer-omgeving kunt verplaatsen. En je moet toch op gegeven moment je recordset naar een object schema transformeren lijkt me?

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 01 maart 2006 @ 13:20:
[...]


Omdat je dan je logica naar je programmeer-omgeving kunt verplaatsen. En je moet toch op gegeven moment je recordset naar een object schema transformeren lijkt me?
Zo ver denk ik nu nog niet... Het enige dat ik zeker moet weten is dat het databaseschema dat ik aandraag uiteindelijk makkelijk te implementeren is.

Verwijderd

Topicstarter
Om de waarde 1,2,4 op te vragen:

SQL:
1
2
3
4
SELECT waardenummer FROM matrix_coordinaten
WHERE waardenummer IN (SELECT waardenummer FROM matrix_coordinaten WHERE dimensie=1 AND positie = 1)
AND waardenummer IN (SELECT waardenummer FROM matrix_coordinaten WHERE dimensie=2 AND positie = 2)
AND waardenummer IN (SELECT waardenummer FROM matrix_coordinaten WHERE dimensie=3 AND positie = 4)

Zie ook dit topic: [rml][ MYSQL] Comparen van een dataset[/rml]

Nette query toch? M.b.v. die functies, dan kom je ook toch op iets dergelijks uit?

[ Voor 18% gewijzigd door Verwijderd op 01-03-2006 14:55 ]


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 28-03 23:48

Gerco

Professional Newbie

@Hierboven, het kan ook zonder subqueries:

Matrix
matrix_id
num_dimensions

Matrix_dimension
matrix_id
dimension
maxcoord

Matrix_value
matrix_id
value_id
value

Matrix_coord
matrix_id
value_id
dimension
coord

Query om (1,3,6) op te halen:
SQL:
1
2
3
4
5
SELECT v.value
FROM matrix_value v
INNER JOIN matrix_coord c1 WHERE c1.matrix_id = v.matrix_id AND c1.value_id = v.value_id AND c1.dimension=1 AND c1.coord = 1
INNER JOIN matrix_coord c2 WHERE c2.matrix_id = v.matrix_id AND c2.value_id = v.value_id AND c2.dimension=2 AND c2.coord = 3
INNER JOIN matrix_coord c3 WHERE c3.matrix_id = v.matrix_id AND c3.value_id = v.value_id AND c3.dimension=3 AND c3.coord = 6

[ Voor 197% gewijzigd door Gerco op 01-03-2006 15:20 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1