1

私はAndroidアプリケーションに取り組んでおり(したがってsqliteを使用する必要がありますHashSet)、リレーショナルデータベースでJavaセット(つまり)をモデル化するための良い方法を探しています。最初は、多対多の関係を持つ2つのテーブルになると思いました。

table name: sets
    _id integer (PK)

table name: fruits
    _id integer (PK)
    name varchar (unique, so alternate key)

table name: fruit_sets
    set_id (FK)    // combination key to prevent
    fruit_id (FK)  // duplicate fruits in each set

したがって、このdbモデルでは、次のような関係をサポートできると確信しています。

[ apple, orange, pear ] != [ apple, orange, grape, pear ]

しかし、

[ apple, orange, pear ] == [ pear, apple, orange ]

したがって、データベースにある場合:

set 1 = [ apple, orange ]
set 2 = [ orange, pear, apple ]
set 3 = [ grape, pear ]
set 4 = [ grape, orange, apple, cherry ]

selectJavaでセットが与えられたとき、私はset_idへの良い方法で苦労していました。したがって、たとえば、JavaでHashSet:を使用している場合、?のクエリを[ apple, orange, pear ]どのように構成しますか?selectset_id

戻る必要がset_idあります:2

...または、この種の関係をモデル化するための別のより良い方法はありますか?

4

1 に答える 1

0

あくまでもコンセプトですが、考え方は明確だと思います

SELECT DISTINCT set_id FROM fruit_sets
WHERE set_id IN (
SELECT DISTINCT set_id FROM fruit_sets WHERE fruit_id = (SELECT _id FROM fruits WHERE name = myHashSet.size().iterator().next)
INTERSECT
SELECT DISTINCT set_id FROM fruit_sets WHERE fruit_id = (SELECT _id FROM fruits WHERE name = myHashSet.size().iterator().next)
INTERSECT
SELECT DISTINCT set_id FROM fruit_sets WHERE fruit_id = (SELECT _id FROM fruits WHERE name = myHashSet.size().iterator().next)
)
GROUP BY set_id HAVING COUNT(*) = myHashSet.size()
于 2012-06-23T23:37:20.383 に答える