在 SQLite 数据库中实现诸如引用计数之类的东西
Posted
技术标签:
【中文标题】在 SQLite 数据库中实现诸如引用计数之类的东西【英文标题】:Implement something like reference counting in SQLite database 【发布时间】:2015-09-25 08:17:04 【问题描述】:问题涉及两个 SQLite 数据库表:
persons
和 measurements
。
一个人可以有多个测量值,但每个测量值只有一个人。所以人与度量是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 中实现自动完成,但没有像“@”这样的“触发器”