Problem mit Datenbankdesign


#1

Ich bin gerade dabei ein Datenbankkonzept (neu) zu entwerfen, wobei es um das Archivieren von Dateien (Bilder, PDF-Dokumente, Videos, …) geht. Diese werden in einer Tabelle tbl_files gespeichert. Es gibt insgesamt 5 verschiedene Medientypen, zwei davon sollen nun zusätzliche Attribute aufnehmen können - und zwar beliebig viele (eventuell auch kar keine).

Bislang habe ich zu diesem Zweck eine Tabelle tbl_attributes angedacht, die folgendermaßen aussieht:
[SQL]INTEGER attribute_id PRIMARY KEY AUTOINCREMENT --Autoindex
TINYINT type --Attributtyp; 0=Technologie, 1=Maschinenkomponenten
VARCHAR(25) attribute --Bezeichnung[/SQL]

Ich stehe nun vor dem Problem, wie ich die Attribute mit den Dateien aus der tbl_files am besten in Beziehung setzen kann. Eine Möglichkeit wäre aus meiner Sicht die Einführung einer zusätzlichen Tabelle in der jeweils die ID einer Datei und die eines bestimmten Attributs aus der tbl_attributes gespeichert wird. Aber ich weiß nicht ob das die optimale Lösung ist.

Wär spitze wenn von euch jemand eine bessere Idee hätte :slight_smile:

EDIT: Ich arbeite übrigens mit SQLite und Java.


#2

Deine Lösung wie du sie machen wolltest ist die schönste Lösung, ich würde dir nur eins raten schreib deine Tabellen etwas anders.
[sql]typ name attribute --kommentar[/sql]
Das ist schöner zu lesen


#3

Du hast wohl recht, ich hab es jetzt auch so umgesetzt. Meine Bedenken waren nur bei der Umsetzung, allerdings habe ich gestern noch den ultimativen SQL-Befehle gefunden:
[sql]SELECT * FROM tbl_files WHERE file_id IN( SELECT file FROM tbl_attr_ref WHERE attribute IN(?,…) );[/sql]

Ich wusste vorher gar nicht, dass sowas überhaupt geht :smiley:


#4

das nennt sich Subselect :wink:
das geht noch besser
[SQL]SELECT * FROM (SELECT * FROM tbl_files) t[/sql]


#5

Gibts nen Grund, warum hier Subselects und keine Joins verwendet werden?


#6

wir wollen Spaß wir wollen Spaß :D::rock


#7

Na denn :smiley:


#8

Euch ist echt fad, oder? :smiley:

@EagleEye
Dein SQL-Code will mir nicht ganz einleuchten.

@The_S
Ich bin leider nicht sonderlich erfahren in SQL (kenn nur ein bisschen die Basics mit MySQL aus der PHP-Programmierung). Was sind JOINs und wie würde man sie in diesem Fall am besten anwenden?


#9

ach das sind nur Wackennachwirkungen :D::rock
Du machst dort eine Abfrage auf die Tabelle t, die aber auch nur eine SQL Abfrage ist. Diese innere Abfrage könnte jetzt auch noch viel komplexer sein.

Ein Join ist eine Verknüpfung von Tabellen
http://wiki.byte-welt.net/wiki/Join


#10

Bei dir wäre das dann wohl sowas wie

[SQL]SELECT * FROM tbl_files files
INNER JOIN tbl_attr_ref attr
ON attr.file=files.file_id
AND attr.attribute IN (?, …)[/SQL]


#11

@The_S
Danke :slight_smile:

Noch eine andere Frage:
Optimiert der Java-Compiler diesen Code zu einem kompakten String?

	"CREATE TABLE IF NOT EXISTS tbl_files (" +
	"file_id INTEGER PRIMARY KEY AUTOINCREMENT," +
	"industry_id INTEGER," +
	"file_index VARCHAR(4)," +
	"client_id INTEGER," +
	"workpiece_id INTEGER," +
	"machine_id INTEGER," +
	"media TINYINT," +
	"conf BOOLEAN," +
	"lang CHAR," +
	"extra VARCHAR(20) NULL," +
	"suffix VARCHAR(4)" +
	");"
);```

#12

Ja, String-Konkatenationen werden beim Kompilieren gemacht.


#13

[ot] Ich würde nach so langer Zeit nicht den letzten Post editieren, sondern einen neuen machen. Sonst fällts keinem Schwein (außer Revenant :smiley: ) auf, dass sich da noch was geändert hat [/ot]


#14

:confused: Ich glaub ich steh grad aufm Schlauch oder so, jedenfalls blick ichs nicht.


#15

christoph hat das worauf du geantwortet hast nachträglich eingefügt und außer dir hat das keiner bemerkt :wink:


#16

jap :slight_smile:


#17

Ein Hoch auf Revenant ^^

Ich hatte eh schon überlegt, aber die Angst vor Doppelposting war einfach zu groß :smiley:


#18

Ne lag einfach nur daran, dass ich erst jetzt in den Thread reingeschaut hab und deswegen hab ich mir auch nix dabei gedacht :smiley:

Also sooo schlau bin ich jetzt auch nich :smiley: :smiley: :smiley:


#19

Zum auslesen eines ResultSet habe ich ja (ua) zwei Möglichkeiten: getString(int) und getString(String)

Ist davon auszugehen, dass die erstere Methode schneller ist, da nicht erst zwei Strings miteinander verglichen werden müssen? Oder spielt das bei HashMaps (die vermutlich intern verwendet werden) eh keine Rolle?


#20

Es ist davon auszugehen, dass du immer die “getXYZ(String)” Methode verwenden solltest. Alles andere macht deinen Code unlesbar, fehleranfällig und nur schlecht erweiterbar.