我有一个数据库,我们缓存各种数据,但它不应该变得太大,所以我需要限制它拥有的相同类型的项目数量,之后它应该拒绝新项目。
作为简化示例,如果数据库有2列 - COUNTRY
和CITY
,则“加拿大”不超过100个城市,“美国”不超过100个城市。如果我已经有来自“加拿大”的70个城市并且想要再添加35个城市,我应该只添加30个,然后停止接受数据库中“加拿大”的新城市。
现在我正在考虑每次添加项目并以这种方式执行策略时使用SELECT COUNT (*) WHERE COUNTRY=?
查询数据库。
有更好的解决方案吗?
答案 0 :(得分:2)
我想到了几种解决方案。您似乎的目标是保留前N个条目,并且选择计数(*)其中country ..可能是解决此问题的方法。您可以为加拿大的每个条目分配计数器(1,2,3 - ),但这会导致严格的数据批量。 在MSSQL上你可以创建一个"而不是"类型的触发器,根据计数计算出现次数和接受/拒绝。您可以接受所有输入,将其存储在数据表中,并仅根据查询或具有此查询的视图显示前100个。
Ketil
答案 1 :(得分:1)
因为世界上只有大约200个国家/地区,如果您为每个国家/地区添加100个城市,这将为您提供20.000条记录,这不是很多,您也可以使用COUNT(*)
来查看是否可以添加更多的城市,但如果你想为每个国家增加100多个城市,你的解决方案将无法很好地扩展(需要更多时间,具体取决于城市/国家的数量,以及表格中是否有其他列等。 )
如果您想扩展到每个国家/地区的更多城市,您可以创建一个中间表,您可以在其中存储每个国家/地区的城市数量,并在向某个国家/地区添加城市时更新该表中的字段。
此外,您可以为一个国家/地区添加已添加的城市数量,因此您不必在每次搜索时都计算这些城市。
所以,第1步:
类似的东西:
Country Cities MoreAllowed
Spain 95 1
USA 45 1
UK 100 0
您可以查询此表格,看看是否仍然可以向一个国家/地区添加更多城市。
第2步:
为了更新此表,您可以在INSERT
上为包含城市的表创建触发器,并且每次插入城市时都会更新此表中的数字。
通过使用此方法,您只需运行一个简单的
SELECT Cities, MoreAllowed
FROM countries_table
WHERE COUNTRY = --your_country--
并使用应用程序中返回的值来确定是否添加更多城市以及更多城市。
答案 2 :(得分:0)
我设法只使用触发器来解决问题。在这个例子中,我强制每个类别最多限制3个项目,我使用时间戳来确定哪个是最旧的并丢弃它。
CREATE TABLE mytable (category, item, timestamp);
CREATE TABLE mytable_counts (category UNIQUE, items_count);
CREATE TRIGGER update_mytable_counts AFTER INSERT ON mytable
BEGIN
UPDATE mytable_counts
SET items_count = items_count + 1
WHERE category = NEW.category;
INSERT OR IGNORE INTO mytable_counts VALUES(NEW.category, 1);
END;
CREATE TRIGGER enforce_limit AFTER UPDATE ON mytable_counts WHEN NEW.items_count > 3
BEGIN
DELETE FROM mytable WHERE category=NEW.category AND timestamp NOT IN (SELECT timestamp FROM mytable WHERE category=NEW.category ORDER BY timestamp DESC LIMIT 3);
UPDATE mytable_counts SET items_count = 3 WHERE ROWID=NEW.ROWID;
END;
我没有尝试优化代码,我也不知道它在大表中的表现如何。