Filrn: MySQL und 1:1 Beziehung

Hallo zusammen,

nachdem ich schon eine weile am suchen bin, habe ich leider meine Frage noch nicht klären können.

Ich möchte mit MySQL (5.0.51a) eine echte 1:1 Verknüpfung zwischen 2 Tabellen erzeugen.

Nach allem was ich bisher gelesen habe, ist es nur möglich eine 1:n Beziehung zu verwenden und dann skriptseitig die 1:1 Beziehung sicher zu stellen.

Von Oracle kenne ich, das man bei der FOREIGN KEY Definition das Schlüsselwort UNIQUE verwendet und dann kümmert sich Oracle um die Einhaltung.

Hab ich es nur nicht gefunden, oder kann ich eine 1:1 Beziehung unter MySQL nicht abbilden?

Regards

Filrn

  1. Hi!

    Hab ich es nur nicht gefunden, oder kann ich eine 1:1 Beziehung unter MySQL nicht abbilden?

    Nicht mit der MyISAM-Engine, aber die InnoDB kann das.

    Lo!

    1. Hallo,

      ich meine eine 1:1 Beziehung. Jede Zeile der einen Tabelle soll in einer andren Tabelle genau einmal auftauchen.

      Hintergrund:

      Ich habe 2 Tabellen mit unterschiedlichen Inhalten. Pro Zeile soll aus jeder Tabelle soll für eine Navigation ein Eintrag erzeugt werden. Da die Reihenfolge der Einträge in der Navigationsliste vom Benutzer bestimmt werden soll, wollte ich die ID's beider Tabellen in einer 3ten zusammenbringen und in dieser die Sortierreihenfolge angeben.

      Mit MySQL (InnoDB) finde ich nur die Anweisung, wie eine 1:n Beziehung angelegt wird. Aber keine 1:1.

      FOREIGN KEY(fk_tbl_A_id)
          REFERENCES tbl_A(id)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION

      erzeugt eine 1:n Beziehung, aber wie definiere ich eine 1:1.

      Regards

      Filrn

      1. Mahlzeit Filrn,

        ich meine eine 1:1 Beziehung. Jede Zeile der einen Tabelle soll in einer andren Tabelle genau einmal auftauchen.

        Warum gibt es dann zwei Tabellen? Wenn für jede Zeile in der einen *genau eine* Zeile in der anderen Tabelle auftaucht (und umgekehrt) liegt Cheatah absolut goldrichtig ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Mahlzeit Filrn,

          ich meine eine 1:1 Beziehung. Jede Zeile der einen Tabelle soll in einer andren Tabelle genau einmal auftauchen.

          Warum gibt es dann zwei Tabellen? Wenn für jede Zeile in der einen *genau eine* Zeile in der anderen Tabelle auftaucht (und umgekehrt) liegt Cheatah absolut goldrichtig ...

          MfG,
          EKKi

          Weil in Tabelle 1 ganz andere Informationen abgelegt sind, als in Tabelle 2.

          Gemeinsam haben beide Tabellen nur die ID und eine Bezeichnung (welche als Text in der Navigation auftaucht). Weil ich aber alle Bezeichnungen aus Tabelle 1 und alle aus Tabelle 2 in einer beliebigen aber festgelegten Reihenfolge brauche fällt UNION aus. Für die Reihenfolge verwende ich in der 3. Tabelle dann ein INTEGER-Spalte mit unique-Index, das stellt dann sicher, das nicht 2 Zeilen die gleiche Positionsnummer bekommen. Füge ich in beide Tabellen je eine Spalte an, muss ich die Einzigartigkeit per PHP sicherstellen, möchte das aber die Datenbank machen lassen.

          Gruß

          Filrn

          1. Mahlzeit Filrn,

            Warum gibt es dann zwei Tabellen?

            »»

            Weil in Tabelle 1 ganz andere Informationen abgelegt sind, als in Tabelle 2.

            Das beantwortet nicht die Frage. Wenn ein Datensatz aus Tabelle 1 *genau einem* Datensatz aus Tabelle 2 entspricht (und umgekehrt) und die beiden Datensätze *immer* zusammengehören, sich komplementär ergänzen und der eine ohne den anderen nicht existieren darf (und umgekehrt), dann gehören sie zusammen in *eine* Tabelle - als *ein* Datensatz.

            Alles andere - insbesondere Deine Struktur - ist schlechtes Datenbankdesign und erzeugt mehr Fehler und Probleme als notwendig ... u.a. das Problem, das Du gerade hast: das hättest Du nicht, wenn die Datenstrukturen vernünftig aufgebaut wären.

            Füge ich in beide Tabellen je eine Spalte an, muss ich die Einzigartigkeit per PHP sicherstellen, möchte das aber die Datenbank machen lassen.

            Ein guter Vorsatz - dann tu das auf die (vermutlich) einzig vernünftige Art und Weise: fasse die jeweiligen Datensätze in *einer* Tabelle zusammen.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        2. Warum gibt es dann zwei Tabellen? Wenn für jede Zeile in der einen *genau eine* Zeile in der anderen Tabelle auftaucht (und umgekehrt) liegt Cheatah absolut goldrichtig ...

          tut er nicht, eine 1:1 beziehung ist noch keine hinreichende begründung alles in eine entität/tabelle zu packen.

          Ilja

  2. Hi,

    Ich möchte mit MySQL (5.0.51a) eine echte 1:1 Verknüpfung zwischen 2 Tabellen erzeugen.

    meinst Du wirklich 1:1 oder 1:0/1? Eine echte 1:1-Beziehung kennt jede MySQL-Engine, sie trägt den Namen "Spalte" und ist pro Tabelle mehrfach einsetzbar.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. meinst Du wirklich 1:1 oder 1:0/1? Eine echte 1:1-Beziehung kennt jede MySQL-Engine, sie trägt den Namen "Spalte" und ist pro Tabelle mehrfach einsetzbar.

      hör endlich mal auf, so alberne dinge über datenbanken zu sagen.

      Ilja

      1. Hallo Ilja!

        meinst Du wirklich 1:1 oder 1:0/1? Eine echte 1:1-Beziehung kennt jede MySQL-Engine, sie trägt den Namen "Spalte" und ist pro Tabelle mehrfach einsetzbar.
        hör endlich mal auf, so alberne dinge über datenbanken zu sagen.

        Hat er das?
        1:1 ist natürlich über Spalten zu lösen und kennt natürlich jede (My)SQL-Engine.

        Für 1:n würde ich auch von MyIsam zu InnoDB wechseln, aber das hat ja nicht unbedingt was mit der SQL-Engine an und für sich zu tun.

        Wobei ich mich auch grad frag ob der OP 1:1 oder 1:n will.

        Wenn ich Schmarn rede, erklär es mir doch bitte!

        Grüße, Matze

        1. moin,

          Hat er das?

          vielleicht stellt sich ja raus, dass es nicht so ist. aber das macht nur sinn, wenn man sich auch mal einer diskussion stellt und nicht immer nur dinge rauswirft und danach "toten mann" spielt.

          1:1 ist natürlich über Spalten zu lösen und kennt natürlich jede (My)SQL-Engine.

          ich gebe zu, in einigen/vielen fachbüchern wird man solche aussagen ebenfalls lesen. trotzdem bleibt es meiner meinung nach unfug. was wo in welche tabelle gehört, das hat erst mal mit der art der beziehung wenig zu tun. dabei geht es vielmehr um atomarität und abhängikeiten. und wenn du zwei entitäten hast, die für sich unabhängig sind, dann werde ich sie nicht in eine entität zusammen bringen, unbabhängig ob es zwischen den beiden entitäten eine 1:1, 1:n oder n:m beziehung gibt. natürlich gibt es auch fälle, wo die attribute einer entität in zwei oder mehrere tabellen aufgeteilt wurden. und wenn man das ganz bewußt macht, dann hat es auch seinen sinn und auch dort sollte man es nicht einfach wieder rückgängig machen. und klar, es wird auch fälle geben, wo es nicht bewußt paasiert ist, es sich um eine entität handelt und dort macht es in der tat sinn, sie wieder in eine tabelle zu überführen. aber das ist einer von mehreren fällen.

          Ilja

          1. Hey Ilja!

            Ich widerspreche dir nicht, aber wir wollten die Frage wohl unterschiedlich beantworten.
            Ich hätte nicht so weit ausgeholt, sonst artet sowas in Grundsatzdiskussionen aus wie man mit Datenbanken umgeht ;)

            Grüße, Matze

            1. Ich hätte nicht so weit ausgeholt, sonst artet sowas in Grundsatzdiskussionen aus wie man mit Datenbanken umgeht ;)

              was nennst du daran weit ausgeholt, dass es sehr wohl sinnvolle 1:1 beziehungen zwischen entitäten geben kann ?

              das problem ist doch, Cheatah schmeisst hier und da immer wieder wortfetzen hin, die oftmals einfach falsch sind und dann verpisst er sich wieder, um irgendwann wieder neuen blödsinn von sich zu geben, ohne sich jemals auf eine diskussion einzulassen.

              Ilja

              1. was nennst du daran weit ausgeholt, dass es sehr wohl sinnvolle 1:1 beziehungen zwischen entitäten geben kann ?

                Nein, die Erklärung dazu. Es hat doch niemand bestritten, dass es sinnvolle 1:1 Beziehungen gibt. Die Frage war nur wie man das in MySQL darstellen kann.

                Die Antwort darauf ist nunmal 1 zusätzliche Spalte.
                FOREIGN KEYS und UNIQUE gibt es auch in MySQL wenn man es denn für eine 1:1 Beziehung braucht.

                das problem ist doch, Cheatah schmeisst hier und da immer wieder wortfetzen hin, die oftmals einfach falsch sind und dann verpisst er sich wieder, um irgendwann wieder neuen blödsinn von sich zu geben, ohne sich jemals auf eine diskussion einzulassen.

                Ich kann nicht für Cheatah sprechen, das möchte ich auch gar nicht.
                Und genau deshalb ist es gerade nicht "das problem".
                Mir ging es nur um die Antwort auf eine recht deutliche und einfache Frage.
                Ich dachte du hättest dazu eine andere/richtigere Lösung.

                Wenn dir Cheatahs Verhalten nicht gefällt, kann ich da am wenigsten ändern.
                Ich selbst hab allerdings oft ausführliche und geduldige Hilfe von ihm bekommen, ohne auf Antworten zu drängeln.
                Daher kann ich dich da auch nicht ganz nachvollziehen.*

                Grüße, Matze

                *war jetzt aber auch ne Weile nicht im Forum - hatte keine Zeit wegen einem sehr schönen Auftrag *happy*

                1. moin,

                  Es hat doch niemand bestritten, dass es sinnvolle 1:1 Beziehungen gibt.

                  dann haben wir beide was unterschiedliches gelesen, bzw. unterschiedlich aufgefasst. für mich meint Cheatah ganz klar, keine zwei tabellen mit foreign key und unique eigenschaft, sondern alles als spalte in eine tabelle unterbringen.

                  Ilja

                  1. Hey Ilja!

                    für mich meint Cheatah ganz klar, keine zwei tabellen mit foreign key und unique eigenschaft, sondern alles als spalte in eine tabelle unterbringen.

                    Klar, würde ich auf Anhieb auch so tun.
                    Aber ich hab auch geschrieben, dass es auch anders geht - wenn es denn sein muss. MySQL kennt halt auch FOREIGN KEYS und UNIQUE.

                    Letztlich lässt sich eine 1:1-Beziehung wie eine 1:n-Beziehung darstellen, ob das aber auch immer sinnvoll ist, ist eine andere Frage.
                    Daher die grundsätzliche Tendenz zu 1 Tabelle bei 1:1.

                    Leider wissen wir nicht, um welche Art Daten es sich handelt.

                    Grüße, Matze

                    1. moin,

                      Letztlich lässt sich eine 1:1-Beziehung wie eine 1:n-Beziehung darstellen, ob das aber auch immer sinnvoll ist, ist eine andere Frage.
                      Daher die grundsätzliche Tendenz zu 1 Tabelle bei 1:1.

                      das sind zwei verschiedene dinge und dessen sollte man sich bewußt sein. du vergleicht gerade äpfel mit birnen. entweder habe ich eine entität oder eben zwei, die in beziehung miteinander stehen. man kann das eine nicht mit dem anderen vermischen, mal so und mal so implementieren, man sollte da schon eine klare linie verfolgen. insofern spielt die tendenz gar keine rolle, sondern ist abhängig davon, was ich habe / machen will. und für Cheatah ist eine 1:1 offenbar niemals sinnvoll. und darüber ärger ich mich, dass er dinge behauptet, die so nicht stimmen und sich dann keiner diskussion stellt.

                      Ilja