在 SQLite 数据库中实现诸如引用计数之类的东西

Posted

技术标签:

【中文标题】在 SQLite 数据库中实现诸如引用计数之类的东西【英文标题】:Implement something like reference counting in SQLite database 【发布时间】:2015-09-25 08:17:04 【问题描述】:

问题涉及两个 SQLite 数据库表: personsmeasurements

一个人可以有多个测量值,但每个测量值只有一个人。所以人与度量是1:M的关系。

我已经有一个显示所有人的列表。 persons表中的数据库实体通过我自己编写的对象关系映射类转换为人对象,然后人名显示在列表中。

现在我必须展开列表,不仅要显示人名,还要显示每个人的测量次数。

一个列表条目应如下所示:

Person XY
2 Measurements

一种方法是在显示列表之前对每个人进行单独的COUNT 查询。然而,这将是一个非常低效和糟糕的解决方案。

另一种方法是将ref_count 列添加到persons 表中,该列必须包含相关测量的数量。

如果感觉关系数据库对于此类问题的结构不好。我应该如何实现这个列表?

【问题讨论】:

对于 SQLite 部分:我想这两个表都有一个用于人“id”的列。你为什么不做一个内部连接给你的名字和使用人'id'的计数? - 对于 android 部分:请发布您的代码 【参考方案1】:

关系数据库非常适合这种用途。

在查询人员表时,您需要更改查询以在测量表中包含每个人的项目数。像这样的东西;

SELECT PersonName, Count(Measurements.ID) AS NumberOfMeasurements
FROM Persons LEFT JOIN Measurements on Measurements.PersonID = Persons.ID
GROUP BY Persons.ID, Persons.PersonName

这将在结果光标中为您提供两列,人名和称为 NumberOfMeasurements 的测量计数。我的 SQL 可能不准确,但计数、连接和分组依据是重要的部分。请注意,您从 Persons 表返回的所有字段都必须包含在分组依据中。

详情请见this网站

【讨论】:

感谢您的帮助。我应该向我的person 类添加一个 ref_count 以存储NumberOfMeasurements 的结果计数吗?问题是这个 ref_count 成员只是一个临时信息,它不应该在person 对象中持久存在。 是的,将 ref_count 字段添加到您的 person 类并从上述查询中填充它。当您通过插入或更新将您的人员类保存到数据库时,只需忽略该字段。如果您使用某种 DAO 库,您的问题尚不清楚。如果您是,那么应该有一种方法可以将某个字段排除在保存之外,通常是该字段上的一个属性。 如果Measurements.PersonID上有索引,这个查询是有效的。 @CL 同意,但如果只有几十个条目,这将没什么区别,尽管在外键上放置索引始终是一个好习惯。 参考设置了一个约束,说这个人必须存在才能进行测量。索引将在处理大量数据时更快地找到一个人的所有测量值,因为它将使用索引而不是读取所有测量值。在您的 CREATE TABLE 语句之后,您应该添加类似 CREATE INDEX MeasurementsPersonIndex ON Measurements(personId);见sqlite.org/foreignkeys.html#fk_indexes

以上是关于在 SQLite 数据库中实现诸如引用计数之类的东西的主要内容,如果未能解决你的问题,请参考以下文章

在 Draft JS 中实现自动完成,但没有像“@”这样的“触发器”

如何在 WebGL 中实现阴影映射?

在SQLite中实现命令执行

PHP中实现函数重载

如何在基于 SQLite 的 recyclerview 中实现 searchview? - 安卓

为啥诸如 :not() 和 :has() 之类的函数伪函数允许引用参数?