Ankündigung

Einklappen
Keine Ankündigung bisher.

Index über 2 Spalten, unique

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Index über 2 Spalten, unique

    Hallo, gibt es eine Möglichkeit einen Index zu setzen der über 2 Spalten geht und von einem Wert abhängig ist?

    Als Beispiel:
    Code:
    Tabellen: user, projects
    
    Tabelle: lnk_user_project
    user_id (int) | project_id (int) | leader (boolean)
                1 |               1  |                0
                2 |               1  |                1
    Ein Unique-Index über "project_id" und "leader" soll verhindern das es in einem Projekt mehrere Leader gibt. Im Beispiel ist also User 2 der Leader des Projekts 1. Pro Projekt also nur ein Leader. Geht das mit einem MySQL Index wie ich es mir gedacht habe?
    Ein normaler Index über diese beiden Spalten würde ja bewirken das ich nur einen Leader und max. einen Projektmitarbeiter pro Projekt eintragen könnte.

  • #2
    Ja das geht.

    In deinem Fall würde ich aber einfach einen PRIMARY-Index über die zwei Spalten legen ( was ja im Grunde nichts anderes ist als ein spezieller Unique-Index).

    Kommentar


    • #3
      Hmm, also ich drücke mich nochmal anders aus, mein Ziel ist es sowas zu ermöglichen:
      Code:
      Tabelle: lnk_user_project
      user_id (int) | project_id (int) | leader (boolean)
                  1 |               1  |                0
                  2 |               1  |                1
                  3 |               1  |                0
                  4 |               1  |                0
                  5 |               2  |                0
                  2 |               2  |                0
                  1 |               2  |                0
                  6 |               2  |                1
      Aber trotzdem via Index zu verbieten das es mehr als einen Leader in einem Projekt gibt. Also ein Index oder Primär-Index (diesen habe ich übrigens über "user_id" und "project_id" gelegt um zu verhindern das ein User mehrmals einem Projekt zugeteilt ist) funktioniert leider nicht.

      Kommentar


      • #4
        Sorry, habe das mit der "leader"-Spalte total überlesen.

        Das geht dann schon nicht mehr mit einem einfachen UNIQEU/PRIMARY-Index.
        Du könntest mal schauen, ob man das was mit Constraints hinkriegt, glaube ich aber jetzt nicht (ich weiß nichtmal ob es bei MySQL (MyISAM) andere Constraints als UNIQUE/PRIMARY gibt).

        Aber wenn ein Projekt sowieso nur einen Leiter haben kann, würde ich einfach direkt in der Projekt-Tabelle die user_id des Leiters ablegen - ist ja dann schließlich eine 1:n Beziehung.

        Kommentar


        • #5
          Benutz doch einfach statt einem INSERT/UPDATE ein REPLACE für das Setzen des Leaders. So kann es nicht passieren, dass 2 eingetragen werden, denn wenn bereits ein Eintrag dafür existiert wird lediglich ein Update (auf die user_id) ausgeführt.

          Ansonsten würde mir nur einfallen, statt leader einen rank einzuführen, der mit dem höchsten Rank gewinnt und ist leader. Auf project_id und rank kannst du dann einen gemeinsamen Index legen.

          Kommentar


          • #6
            Danke Euch für die Antworten, einen Rank einzuführen ist gar keine schlechte Idee, zumal auch gleich die Verantwortungshierachie irgendwie untergebracht werden kann. Mal sehen ob ich das so noch umsetzen kann oder ob ichs bei der nächsten Überarbeitung einbaue.
            Werde dann beide Ideen umsetzen, der Leader kommt in die Projekt-Tabelle und gleichzeitig ein Rank in die Link-Tabelle.

            Kommentar

            Lädt...
            X