0

Android用のローカルデータベースを構築しようとしています。私は少し迷っています。

アプリはドキュメント管理アプリです。以下を保存する必要があります...

Document
--------
Id
import date
List<DocTags>
extension 
etc

次に、さまざまな情報を持つdocTagがいくつかあります

Location
-------
id
name
lat
long

Company
------
Id
name
Street
town

他の約10種類のドキュメント。

ドキュメントに割り当てられているすべてのdocTagIDを格納するためのテーブルが必要であることに気付きましたが、これらは多くの異なるテーブルに関連しています。私の問題は、doctagIdまたは複数のdoctagidを検索して、ドキュメントのリストを取得する必要があることです。10,000個以上のドキュメントがあり、これは40,000個のドキュメントタグに相当すると想定する必要があります。したがって、パフォーマンスは大きな問題です。データベースを構築するための最良の方法は何ですか?

doctag名も検索する必要があります。

ありがとう

4

2 に答える 2

2

ドキュメントをタグに関連付ける多対多の JOIN テーブルが必要です。

これらのタグを複数のテーブルに含めることはありません。それは最初の正規形を破ります。他のテーブルがタグ行を参照する必要がある場合は、それらにも JOIN テーブルを与えます。

以下のコメントは、正規化の復習が必要か、リレーショナル モデルが問題に最適な選択ではない可能性があることを示唆しています。おそらく、NoSQL のドキュメント ベースのソリューションの方が適しているでしょう。

于 2012-05-16T12:37:30.650 に答える
-2

私は SQLite を 1、2 回しか使用したことがありませんが、他のデータベース システムでの経験に基づいて、他のことを試す前に、しっかりしたリレーショナル スキーマから始めて、パフォーマンスを評価することを強くお勧めします。

あなたの場合、スキーマは次のようになると思います。

2 つの doctag を含むサンプル DB スキーマ

(もちろん、doctag ごとに 2 つのテーブルが追加されています)。

多くのテーブルがあり、おそらくすべての情報を取得するには非常に長いクエリが必要になりますが、これは必ずしも悪いことではありません。スキーマをリレーショナルにすることで、クエリ オプティマイザーがその仕事を行うことができ、将来のクエリをより簡単に記述できるようになります。

ドキュメント、およびその場所と会社に関する情報を取得するクエリ (ドキュメントにこのタグがない場合は null を返す) は、次のようになります。

SELECT * FROM Document
    LEFT JOIN DocumentLocation ON Document.ID=DocumentLocation.DocumentID
        INNER JOIN Location ON DocumentLocation.LocationID=Location.LocationID
    LEFT JOIN DocumentCompany ON Document.ID=DocumentCompany.DocumentID
        INNER JOIN Company ON DocumentCompany.CompanyID=Company.CompanyID

これのパフォーマンスが遅すぎることが判明した場合は、アプリケーションの予想される使用パターンに応じて、パフォーマンスを改善するための戦略 (キャッシング、追加のインデックスなど) を調査できます。

于 2012-05-16T13:20:33.597 に答える