Zwei unabhängige IDs

gerritkpunkt

Neuer Benutzer
Beiträge
3
Hallo Leute,

ich programmiere momentan ein ProjektManagmentSystem auf CakePHP Basis. Nun möchte ich Bugs, Ideen und ähnliches pro Projekt mit einer eigenen ID ausstatten. Ich habe also einmal die PrimaryKey AutoIncrement und eine Projekt ID. Je Projekt ID soll letztendlich nochmal ein eigenes AutoIncrement arbeiten. Geht nicht, weiß ich. Wie lässt sich das am geschicktesten lösen? Ich dachte jetzt momentan daran, dass jedes Projekt eine Spalte erhält mit last_bug_id und die dann einfach incrementiert wird. Gibt es da eine einfachere sinnigere Lösung oder habe ich schon den richtigen Weg gefunden?

Gruß
Gerrit K.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.042
Hallo Leute,

ich programmiere momentan ein ProjektManagmentSystem auf CakePHP Basis. Nun möchte ich Bugs, Ideen und ähnliches pro Projekt mit einer eigenen ID ausstatten. Ich habe also einmal die PrimaryKey AutoIncrement und eine Projekt ID. Je Projekt ID soll letztendlich nochmal ein eigenes AutoIncrement arbeiten. Geht nicht, weiß ich. Wie lässt sich das am geschicktesten lösen? Ich dachte jetzt momentan daran, dass jedes Projekt eine Spalte erhält mit last_bug_id und die dann einfach incrementiert wird. Gibt es da eine einfachere sinnigere Lösung oder habe ich schon den richtigen Weg gefunden?

Gruß
Gerrit K.


2 Tabellen, eine für die Projekte mit deiner Projekt-ID und eine mit den Bugs und Ideen mit einem SERIAL und einem Fremdschlüssel auf das Projekt.

Das Prinzip nennt sich 'Normalisierung'.



Andreas
 

gerritkpunkt

Neuer Benutzer
Beiträge
3
Ja das ist mir schon klar... Für CakePHP braucht aber jede Tabelle eine ID mit AutoIncrement. Jetzt will ich das je Projekt die Bugs Projektinterne IDs erhalten. Also nicht eine Tabellenübergreifende sondern nur Projektbezogene. Ein Serial nimmt ja scheinbar auch die Anzahl an Datensätzen und incrementiert?

Bug
ID 5 (AI, Primary)
Project_ID (Fremdschlüssel)
NUMBER (Number & Project_ID = UNIQUE) << Wie erreiche ich es das er dort automatisch eine art AI im Bezug aufs Projekt ausführt
Name
Description
[....]
 

akretschmer

Datenbank-Guru
Beiträge
9.042
Ja das ist mir schon klar... Für CakePHP braucht aber jede Tabelle eine ID mit AutoIncrement. Jetzt will ich das je Projekt die Bugs Projektinterne IDs erhalten. Also nicht eine Tabellenübergreifende sondern nur Projektbezogene. Ein Serial nimmt ja scheinbar auch die Anzahl an Datensätzen und incrementiert?

Bug
ID 5 (AI, Primary)
Project_ID (Fremdschlüssel)
NUMBER (Number & Project_ID = UNIQUE) << Wie erreiche ich es das er dort automatisch eine art AI im Bezug aufs Projekt ausführt
Name
Description
[....]

Wozu soll NUMBER dienen? Du hast einen PK und einen Fremdschlüssel und damit alles richtig abgedeckt, ich sehe nicht, wozu NUMBER diesen soll.


Andreas
 

gerritkpunkt

Neuer Benutzer
Beiträge
3
Es geht einfach darum das jedes Projekt seine Bugs mit eigenen Sichtbaren IDs abdecken soll. Nicht das man einen Bug erstellt. in einem Projekt dann ein anderen und dem vorherigen wieder ein und da ein Zahlensprung drin ist.
 

akretschmer

Datenbank-Guru
Beiträge
9.042
Es geht einfach darum das jedes Projekt seine Bugs mit eigenen Sichtbaren IDs abdecken soll. Nicht das man einen Bug erstellt. in einem Projekt dann ein anderen und dem vorherigen wieder ein und da ein Zahlensprung drin ist.

Ah okay.

Nun ja, wenn man das wirklich braucht, dann vielleicht eine extra Tabelle, wo für jedes Projekt die letzte Bug-ID drin steht. Aufpassen beim aktualisieren, da vielleicht mit Dingen wie 'select for update' oder anderen Sperren arbeiten, nicht daß bei 2 gleichzeitig reingekippten Bugs dieselbe Nummer ermittelt wird.

Aber vielleicht dennoch mal hinterfragen, ob es denn wirklich so ein großes Problem ist, wenn da Zahlensprünge drin sind. Wichtig ist doch, daß es eindeutige Zuordnungen sind, der Rest ist 'Optik'.


Andreas
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.042
Ein Serial nimmt ja scheinbar auch die Anzahl an Datensätzen und incrementiert?

Nur um das richtig zu stellen: SERIAL ist wie das Nummernziehen auf dem Arbeitsamt: du ziehst eine Nummer. Der nächste zieht die nächste Nummer. Du kannst Deine Nummer auch wegwerfen, deswegen wird die Nummer nicht wieder frei. Es wird nicht gezählt, wieviel Leute vor Dir korrekt behandelt wurden (COMMIT), sondern es werden fortlaufend Nummern vergeben. Der Unterschied zum 'Anzahl der Datensätze und incrementieren' ist gewaltig: wenn eine Transaktion fehlschlägt, ist die Nummer weg, es gibt kein Rollback für die Nummern.

Das ist in PG mit Serial so und in MySQL mit Auto_Increment.

Der Unterschied hier ist, daß Serial in PG z.B. auch Tabellenübergreifend arbeiten kann, Auto_Increment ist immer an eine einzelne Tabelle gebunden. Ein Serial bei PG kann in einer, keiner oder in vielen Tabellen genutzt werden.
 
Oben