0

Ich verwende RethinkDB (2.3.5 ~ 0trusty) und Python (2.7.6) und Python-Rethinkdb Bindings (2.3.0.post6) und versuchen eine bereits vorhandene Datenbank abfragen. (dh bitte annehmen kann ich nicht das Schema ändern, die ich arbeite mit)Filtern einer Verknüpfung basierend auf Fremdschlüsseln in Listenwerten in RethinkDB

Dies ist ein vereinfachtes Beispiel für das Problem, das ich habe.

Namen von Tabellen/etc wurden in eine Domäne bewegt Leute sind mehr verwendet zu, aber das Problem, das ich habe, ist strukturell gleichwertig (und kompakter).

Borrowers

Schema: (borrower_id:key (primary), name :string, favourite_authors : list of author_id) 

Sample data: 
{ "borrower_id": "91a15585-f084-41b3-9df1-1a3b16a8daed", 
    "name": "Jo", 
    "favourite_authors" : [ "b9503702-8832-43c8-a3f0-34691635419a", 
          "3bae9a66-2de6-4c64-ae95-c5f7caad86bb", 
         ] 
} 
{ "borrower_id": "23a8a193-c32e-4332-a40b-2ba56d158205", 
    "name": "Bob", 
    "favourite_authors" : [ "41305d3b-2819-4af5-be62-3c7999c4d747", 
          "d270f08d-aab1-4644-8dea-8f4fdd2d80b4" 
         ] 
} 
{ "borrower_id": "01031fb0-35de-4324-af47-611fec9ca7ad", 
    "name": "Sam", 
    "favourite_authors" : [ "b9503702-8832-43c8-a3f0-34691635419a" 
         ] 
} 

Autoren

Schema: (author_id:key (primary), name :string, books_written : list of book_id) 

Sample data: 
{ "author_id": "b9503702-8832-43c8-a3f0-34691635419a", 
    "name": "Joanna Smith", 
    "books_written" : [ "c1a48e2e-a831-4f5b-95b2-9b429dcf34e5", 
         "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d", 
        ] 
} 
{ "author_id": "3bae9a66-2de6-4c64-ae95-c5f7caad86bb", 
    "name": "John Smith", 
    "books_written" : [ "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d", 
         "b9fb4de0-e3bd-4df1-b192-c9a0ae7fb2e1", 
        ] 
} 
{ "author_id": "41305d3b-2819-4af5-be62-3c7999c4d747", 
    "name": "Jo Smith", 
    "books_written" : [ "b9fb4de0-e3bd-4df1-b192-c9a0ae7fb2e1", 
         "37b6eb03-e8ea-43dc-b3e4-ffc0bbfb1154", 
        ] 
} 
{ "author_id": "d270f08d-aab1-4644-8dea-8f4fdd2d80b4", 
    "name": "Jim Smith", 
    "books_written" : [ "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d", 
         "37b6eb03-e8ea-43dc-b3e4-ffc0bbfb1154", 
        ] 
} 

Bücher

Schema: (book_id:key (primary), name:string, book_info: object, may contain a data 
                 dict, that has a list of 
                 repeatable metadata options...) 

Sample data: 
{ "book_id": "c1a48e2e-a831-4f5b-95b2-9b429dcf34e5", 
    "name": "", 
    "book_info" : { 
     "data" : [ 
       { "tag": "sf }, 
       { "period" : "past"} 
       ] 
     } 
} 
{ "book_id": "8f0e89b6-78e8-45ec-b7db-9cf3e00e0a8d", 
    "name": "", 
    "book_info" : { 
     "data" : [ 
       { "tag": "romance }, 
       { "period" : "present"} 
       ] 
     } 
} 
{ "book_id": "89b68f0e-78e8-45ec-b7db-9cf3e00e0a8d", 
    "name": "", 
    "book_info" : { 
     "data" : [ 
       { "period" : "present"} 
       ] 
     } 
} 
{ "book_id": "b9fb4de0-e3bd-4df1-b192-c9a0ae7fb2e1", 
    "name": "", 
    "book_info" : { 
     "data" : [ 
       { "tag": "sf }, 
       { "tag": "romance}, 
       { "period" : "present"} 
       ] 
     } 
} 
... 
{ "book_id": "37b6eb03-e8ea-43dc-b3e4-ffc0bbfb1154", 
    "name": "", 
    "book_info" : { 
     "data" : [ 
       { "tag": "sf }, 
       { "period" : "future"} 
       ] 
     } 
} 

nun die gemeinsame Abfrage I entspricht dies ausführen möchten:

  • „Können Sie mir eine Liste aller Kreditnehmer geben, die Lieblings-Autoren, die verfasst haben‚sf‘Bücher“ ...

Hinweis: Nicht alle Bücher haben eine Tags Option im Datenteil von Buch info ...

ich versuche, eine Kombination, um herauszufinden, von Verknüpfungen und Filter verwendet RethinkDB der ReQL Abfrageschnittstelle - die ich sicher bin, kann dies tun - aber ich kann nicht eine offensichtliche Art und Weise von ding sehen es.

Mein Ausgangspunkt war bei RethinkDB des zu suchen verschiedenen Join-Optionen, aber ich kann nicht beitreten offensichtliche Art und Weise der Durchführung mit einem Attribut , die enthält eine Liste von Fremdschlüsseln und nicht nur ein Atom Schlüssel sehen. (ich normalerweise entweder würde die Fremdschlüssel auf dem Feld setzen, die wiederholt oder eine Beziehung Tisch bekommt, aber wie ich sage, kann ich nicht die Struktur Ich habe aus)

ich lieber Python orientierte Lösung, aber Javascript (oder jede andere Sprache) wäre praktisch, da ich dann konvertieren kann :-)

Alle Vorschläge willkommen.

Antwort

1

Dieser Code wird (Javascript) tun, was:

r.db("test").table("Borrowers").filter(function(borrower){ 
    return borrower("favourite_authors").setIntersection(r.db("test").table("Authors").filter(function(author){ 
    return author("books_written").setIntersection(r.db("test").table("Books").filter(function(book){ 
     return book("book_info")("data").contains({"tag": "sf"}); })("book_id").coerceTo("array")).isEmpty().not();})("author_id").coerceTo("array")).isEmpty().not();}) 

Aber schon sehr langsam, auf einem db nur die Beispieldaten (35-70ms auf meinem Server), die

Es ist im Grunde ein conjuction von 3 Unterabfragen:

1:

r.db("test").table("Books").filter(function(book){ 
    return book("book_info")("data").contains({"tag": "sf"}); })("book_id").coerceTo("array") 

Dies ist die innere. Es ruft ein Array ab, das die IDs aller Bücher enthält, die als sf gekennzeichnet sind.Dieses Array wird in den folgenden Unterabfrage setzen:

r.db("test").table("Authors").filter(function(author){ 
    return author("books_written").setIntersection(<book ids go here>).isEmpty().not();})("author_id").coerceTo("array") 

die ein Array aller Autor ids abruft, die in einem oder mehreren der gegebenen Bücher teilgenommen. Es filtert durch Nichtleere der Kreuzung der Autorenbücher und der Anordnung von SF-Büchern. (Wenn der Kreuzung ist nicht leer, mindestens ein Buch des Autors als sf markiert)

r.db("test").table("Borrowers").filter(function(borrower){ 
    return borrower("favourite_authors").setIntersection().isEmpty().not();}) 

Der letzte Teil auf dem gleichen Prinzip wie die zweite basiert und gibt schließlich die Kreditnehmer, die einen Autor begünstigen die hat ein SF-Buch geschrieben.

+0

Das ist sehr geschätzt - danke - Star! So haarig wie ich es erwartet hatte. Mehrere Lambdas in Python (wo ich es brauche) werden genauso langsam sein - wenn nicht langsamer ... –

Verwandte Themen