Ich habe eine Frage zum Datenbankdesign. Ich frage hier, weil ich ein Enthusiast / Hobbyist und kein "Profi" bin, also möchte ich es nicht in den Stapelaustausch "Datenbankadministratoren" stellen, der speziell auf Profis ausgerichtet ist. Ich hoffe das ist der richtige Ort.
Ich möchte ein System aufbauen, um Begegnungen zwischen Gefangenen und Strafvollzugsbeamten zu verfolgen. Beim Entwerfen einer relationalen Datenbank habe ich die folgenden fünf Tabellen gefunden:
CREATE TABLE `encounters` (
`id` INT NOT NULL,
`encounterdate` DATETIME NULL,
`officers_id` INT NOT NULL,
`prisoners_id` INT NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `officers` (
`id` INT NOT NULL,
`badgenumber` VARCHAR(10) NULL,
`lastnames_id` INT NOT NULL,
`firstnames_id` INT NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `prisoners` (
`id` INT NOT NULL,
`regnumber` VARCHAR(10) NULL,
`lastnames_id` INT NOT NULL,
`firstnames_id` INT NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `firstnames` (
`id` INT NOT NULL,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `lastnames` (
`id` INT NOT NULL,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`id`)
);
mit folgenden Beziehungen:
Dieses Setup würde mich daran hindern, alle Vor- und Nachnamen zweimal zu speichern (einmal für die Beamten und einmal für die Gefangenen), aber ich bin nicht sicher, wie ich den Vor- / Nachnamen eines bestimmten Beamten UND den Vor- / Nachnamen eines bestimmten Gefangenen abrufen soll für eine gegebene Begegnung. Im Idealfall möchte ich eine SELECT-Anweisung verwenden, um einen Datensatz zu erhalten, der wie eine der folgenden Zeilen aussieht:
Ich kann innere Verknüpfungen verwenden, um Vor- und Nachnamen für einen Offizier zu erhalten:
SELECT
encounters.encounterdate,
officers.badgenumber,
prisoners.regnumber,
fnames.name,
lnames.name
FROM
encounters
INNER JOIN prisoners ON encounters.prisoners_id = prisoners.id
INNER JOIN officers ON encounters.officers_id = officers.id
INNER JOIN fnames on officers.firstnames_id = fnames.id
INNER JOIN lnames on officers.lastnames_id = lnames.id
WHERE
officers.badgenumber = "b503"
oder ein Gefangener:
SELECT
encounters.encounterdate,
officers.badgenumber,
prisoners.regnumber,
fnames.name,
lnames.name
FROM
encounters
INNER JOIN prisoners ON encounters.prisoners_id = prisoners.id
INNER JOIN officers ON encounters.officers_id = officers.id
INNER JOIN fnames on prisoners.firstnames_id = fnames.id
INNER JOIN lnames on prisoners.lastnames_id = lnames.id
WHERE
officers.badgenumber = "b503"
aber ich kann nicht herausfinden, ob es möglich ist, BEIDE für eine gegebene Begegnung mit nur einer SELECT-Anweisung zu erhalten.
Natürlich könnte ich es mit einer gespeicherten Prozedur / Funktion und ein paar SELECTs machen, aber ich bin interessiert zu hören, ob es einen einfacheren Weg gibt, es mit einem SELECT zu machen. Oder ist dies nur ein schlechter Weg, um eine Datenbank zu entwerfen?
Danke für Ihre Hilfe.