1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Zwei unabhängige IDs

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von gerritkpunkt, 3 März 2013.

  1. gerritkpunkt

    gerritkpunkt Neuer Benutzer

    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. akretschmer

    akretschmer Datenbank-Guru


    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
     
  3. gerritkpunkt

    gerritkpunkt Neuer Benutzer

    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
    [....]
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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
     
  5. gerritkpunkt

    gerritkpunkt Neuer Benutzer

    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.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden