0

我正在尝试为 android 建立一个本地数据库。我有点失落。

该应用程序是一个文档管理应用程序..我需要保存以下...

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

然后我有许多具有不同信息的 docTag

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

Company
------
Id
name
Street
town

大约 10 种其他文档类型。

我意识到我需要一个表来存储分配给文档的所有 docTag id,但这些与许多不同的表相关。我的问题是我需要通过搜索 doctag Id 或多个 doctag id 来检索文档列表。我们需要假设我们有 10,000 多个文档,这可能相当于 40,000 个文档标签。所以性能是一个主要问题。构建数据库的最佳方法是什么?

我还需要搜索 doctag 名称。

谢谢

4

2 回答 2

2

我会有一个多对多的将文档与标签相关联的 JOIN 表。

我不会多个表中包含这些标签。这打破了第一范式。如果其他表需要引用 Tag 行,也给它们 JOIN 表。

您在下面的评论表明,要么规范化复习是必要的,要么关系模型可能不是解决您的问题的最佳选择。也许 NoSQL、基于文档的解决方案更适合。

于 2012-05-16T12:37:30.650 回答
-2

我只使用过一次或两次 SQLite,但根据我对其他数据库系统的经验,我强烈建议从可靠的关系模式开始,并评估性能,然后再尝试其他任何操作。

在您的情况下,我认为架构看起来像这样。

带有两个文档标签的示例数据库模式

(当然,每个 doctag 有两个额外的表格)。

您将有很多表,并且可能需要很长的查询才能获取所有信息,但这不一定是一件坏事。拥有关系模式将允许查询优化器完成其工作,并使未来的查询更容易编写。

获取文档的查询以及有关其位置和公司的任何信息(如果文档没有此标记,则返回 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 回答