1

私はSQLiteを使用していますが、これができるかどうかわかりません。私がこれらのテーブルを持っていると考えてください:

======>Table: Total_Table

_id    Name   Ingredients

0     "A"     "table_a"<br>
1     "B"     "table_b"

=====>Table: table_a

 _id    Name

 0      "a_1" <br>
 1      "a_2"

=====>Table: table_b

_id    Name
0      "a_1" <br>

の行で参照されるテーブルの行Total_Table数は異なり、の行Total_Tableが追加されると作成されます。

現時点では、から行を返すクエリを構成する必要がありますTotal_Table

Ingredientsただし、テーブルのエントリを検索します。

たとえば、テーブルにa_1Total_Tableが含まれるすべての行を検索すると、からの行が返されます。Ingredients0,1Total_Table

現在、私はのすべての行をクエリしTotal_Table、次にそれらのエントリを反復処理し、各テーブルを個別にクエリして、配列を形成することでこれを行っています。

私が調べているテーブルは比較的大きく、パフォーマンスを低下させるため、これはかなり悪いことです。

何か案は?ありがとう!

4

2 に答える 2

1

少し異なるデータベーススキーマを使用すると、これが簡単になると思います。SQLiteはリレーショナルデータベースなので、それに応じて保存してみましょう。基本的に、3つのテーブルがありTotal_Tableます。1つは材料用、もう1つは材料用、そしてどの材料をのどのインスタンスにマップするためのテーブルTotal_Tableです。

論理的には、次のようになります。

Table: Total_Table

_id    Name
0      "A"
1      "B"

Table: Ingredients

_id    Name

0      "a_1"
1      "a_2"

Table: Total_Ingredients

total_id  ingredient_id
0         0
0         1
1         0

ここでのメリットはたくさんあります。まず、実行時にテーブルを作成する必要はありません。Total_Tableエントリの数に関係なく、正確に3つのテーブルが必要になります。第二に、クエリは簡単です。a_1第3に、改訂されたスキーマのどこにも名前を複製していません(これはデータベースの正規化と呼ばれます)。

すると、クエリは次のようになります。サンプルデータでa_1は、IDが0であることに注意してください。これは、クエリの目的で使用します。

select _id, Name from Total_Table where id in 
  (select total_id from Total_Ingredients where ingredient_id = 0)

更新:私が正しく理解していれば、他のクエリはかなり似ています。したがって、特定の材料の一部またはすべてを含むレシピが必要です。この例のサブセットにID1、5、および7が含まれているとすると、唯一の変更はin句を使用することです。

select _id, Name from Total_Table where id in 
  (select distinct total_id from Total_Ingredients where ingredient_id in (1,5,7)) 
于 2012-07-24T13:52:42.467 に答える
0

テーブルを1つ(できればビュー)として組み合わせてから、ルックアップを実行してみてください。または、次のようにクエリを実行します。

String name = "bla bla bla";

"SELECT DISTINCT _id FROM Total_Table WHERE _id IN
     ((SELECT _id FROM table_a WHERE Name='" + name + "') UNION ALL
      (SELECT _id FROM table_b WHERE Name='" + name + "'))"
于 2012-07-24T13:55:06.050 に答える