Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 34
Like Tree1Likes

Thema: Einzigartigkeit von Priorisierungen von Einträgen in Tabellen sicherstellen

  1. #1
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard Einzigartigkeit von Priorisierungen von Einträgen in Tabellen sicherstellen

    Ich hoffe ich befinde mich in der richtigen Rubrik...
    Ich habe eine Tabelle die als Fremdschlüssel eindeutige IDs aus einer einer anderen Tabelle übernimmt. Zu jedem Fremdschlüssel gibt es mehrere Einträge - jedoch darf es nur einen 'Haupteintrag' zu jedem Fremdschlüssel geben.
    Code:
    ID  |  Eintrag
    -----------------
    1   |  a
    1   |  b
    1   |  C
    1   |  d
    2   |  A
    2   |  b
    2   |  c
    3   |  A
    Der großgeschriebene Eintrag soll den 'Haupteintrag' darstellen.
    Ist es hier am sinnvollsten eine weitere Spalte vom Typ 'binary' hinzuzufügen und den Haupteintrag auf true zu setzen und mit einer RULE sicherzustellen, dass es pro ID immer nur einen Eintrag mit true gibt? Oder gibt es da bessere Alternativen?

    Danke für Hinweise!

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von strippenzieher Beitrag anzeigen
    Ich hoffe ich befinde mich in der richtigen Rubrik...
    Ich habe eine Tabelle die als Fremdschlüssel eindeutige IDs aus einer einer anderen Tabelle übernimmt. Zu jedem Fremdschlüssel gibt es mehrere Einträge - jedoch darf es nur einen 'Haupteintrag' zu jedem Fremdschlüssel geben.
    Code:
    ID  |  Eintrag
    -----------------
    1   |  a
    1   |  b
    1   |  C
    1   |  d
    2   |  A
    2   |  b
    2   |  c
    3   |  A
    Der großgeschriebene Eintrag soll den 'Haupteintrag' darstellen.
    Ist es hier am sinnvollsten eine weitere Spalte vom Typ 'binary' hinzuzufügen und den Haupteintrag auf true zu setzen und mit einer RULE sicherzustellen, dass es pro ID immer nur einen Eintrag mit true gibt? Oder gibt es da bessere Alternativen?

    Danke für Hinweise!
    Code:
    test=# create table s (id int, eintrag char);
    CREATE TABLE
    Time: 0,828 ms
    test=*# create unique index idx_s on s(id) where eintrag=upper(eintrag);
    CREATE INDEX
    Time: 2,945 ms
    test=*# insert into s values (1,'a');
    INSERT 0 1
    Time: 0,385 ms
    test=*# insert into s values (1,'b');
    INSERT 0 1
    Time: 0,216 ms
    test=*# insert into s values (1,'C');
    INSERT 0 1
    Time: 0,379 ms
    test=*# insert into s values (1,'D');
    ERROR:  duplicate key value violates unique constraint "idx_s"
    DETAIL:  Key (id)=(1) already exists.
    Hab ich Dich richtig verstanden?


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard

    Hey Andreas,

    im Grunde ja, nur das die Großschreibung der einzigartigen Einträge nur beispielhaft war. In der Tabelle stehen später ganze Wörter. Am Wort selbst ist aber nicht erkennbar ob es ein Haupt- oder nur ein Nebeneintrag ist.

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von strippenzieher Beitrag anzeigen
    Hey Andreas,

    im Grunde ja, nur das die Großschreibung der einzigartigen Einträge nur beispielhaft war. In der Tabelle stehen später ganze Wörter. Am Wort selbst ist aber nicht erkennbar ob es ein Haupt- oder nur ein Nebeneintrag ist.
    Wie dann?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard

    Der erste hinzugefügte Eintrag für ein foreign key ist der Haupteintrag. Alle folgenden sollen Nebeneinträge werden. Daher meine Idee mit den RULES...

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von strippenzieher Beitrag anzeigen
    Der erste hinzugefügte Eintrag für ein foreign key ist der Haupteintrag. Alle folgenden sollen Nebeneinträge werden. Daher meine Idee mit den RULES...
    Datenbanken hantieren mit Mengen, von daher ist das etwas schlecht zu definieren. Was ist, wenn dieser Eintrag gelöscht wird?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    Wenn Du ein entsprechendes Flag zu der Tabelle dazu nimmst, dann geht es auch ohne RULES:

    Wenn diese Spalte vom Typ boolean ist ("binary" gibt es bei Postgres nicht - keine Ahnung was Du damit gemeint hast), dann kannst Du das verwenden um einen entsprechenden Index anzulegen:

    Code:
    create unique index check_main on the_table (id) where is_main
    is_main ist die neue Spalte vom Typ boolean. Wenn diese den Wert true hat, dann kann es die ID nur einmal geben. Ansonsten beliebig oft. Du must nur dafür sorgen, dass diese Spalte den korrekten Wert enhält.
    strippenzieher likes this.
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  8. #8
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard

    Wenn dieser Eintrag mit dem boolean-flag (keine Ahnung was mich da mit binary trieb...) gelöscht würde wäre das allerdings schlecht. Vielleicht ist mein Ansatz auch viel zu kompliziert.
    Ich suche eine einfache effiziente Methode für eine Suche von Büchern. Schwierig wird es durch den Umstand, dass es von einem Werk durchaus über 200 Ausgaben geben kann - das schließt fremdsprachige mit ein. Die habe ich in einen tsvector gepackt und den Autor gleich mit drangehangen.
    Code:
    textsearchable_index_gin = setweight(to_tsvector(e.title_lang, coalesce(e.title,'')), 'A') ||
    setweight(to_tsvector('simple', coalesce(an.name,'')), 'B')
    Da ich aber auch fremdsprachige Autorennamen finden lassen will hatte ich hier: http://www.pg-forum.de/allgemeines/5...der-suche.html schon mal nach der geeigneten Methode gefragt.
    Ich habe mich nun dafür entschieden nur einen Namen in den tsvector zu packen, weil beim Hinzufügen einer anderen Schreibweise sonst sämtliche Ausgaben aller Bücher eines Autors geändert werden müssten was mal locker 30000 sein können und gin-updates ziemlich zäh verlaufen.
    Um auch die anderen Schreibweisen zu finden wollte ich nun in der Suchanfrage 'query rewriting' benutzen und in meiner Autorentabelle eben jenen Haupteintrag des Autors rausfischen der zu dem eingegebenen passt. Sollte sich aber irgendwann rausstellen, dass der Haupteintrag falsch ist würde ich den loswerden wollen.
    Wäre es da vielleicht sogar sinnvoller nicht den Autornamen in meinen tsvector zu schreiben sondern sogar nur die Autoren-ID? Dann wäre ich die Sache mit dem Haupteintrag los und würde lediglich vor der eigentichen Suche die ID per 'query rewriting' in die Suchanfrage einfügen. Oder macht man sowas erfahrungsgemäß nicht?

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Du scheinst wesentlich mehr Probleme zu haben als nur diese Suche.
    Vielleicht solltest du mal von vorne anfangen und grundsätzlich das Design überarbeiten.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard

    Könntest du da etwas präziser sein?

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 30.03.2012, 16:35
  2. Frage Fortlaufende Tabelle/View mit Datum Einträgen
    Von vriza im Forum SQL
    Antworten: 2
    Letzter Beitrag: 07.04.2011, 16:38
  3. Spalte aus mehreren einträgen erstellen
    Von beanchen im Forum SQL
    Antworten: 4
    Letzter Beitrag: 17.11.2008, 14:08
  4. Antworten: 4
    Letzter Beitrag: 10.08.2007, 09:20
  5. Antworten: 1
    Letzter Beitrag: 13.03.2007, 07:41

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum