构建具有多个外键的数据库以实现高性能

时间:2012-05-16 12:35:02

标签: android sql database sqlite database-design

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

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

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

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

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

Company
------
Id
name
Street
town

大约10种其他文档类型。

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

我还需要搜索doctag名称。

谢谢

2 个答案:

答案 0 :(得分:2)

我有很多关于Document to Tag的JOIN表。

在多个表中都有这些标签。这打破了第一个正常形式。如果其他表需要引用Tag行,也可以给它们JOIN表。

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

答案 1 :(得分:-2)

我只使用过一次或两次SQLite,但是根据我对其他人的经验 数据库系统,我强烈建议从一个可靠的关系模式开始, 在尝试其他任何事情之前评估表现。

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

Sample DB schema with two doctags

(当然每个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

如果性能确实太慢,您可以根据应用程序的预期使用模式调查改进性能的策略(例如缓存,附加索引)。