数据库的N项容量

我有一个数据库,可以缓存各种数据,但不应该变得太大,所以我需要限制它拥有相同类型的项目数量,之后它应该拒绝新项目。

所以作为一个简单的例子,如果数据库有2列 - COUNTRYCITY ,它应该有不超过100个来自“加拿大”的城市和不超过100个来自“USA”的城市。 如果我已经有70个来自“加拿大”的城市并且想要增加35个城市,我应该只添加30个城市,然后停止在数据库中接受“加拿大”的新城市。

现在我想用SELECT COUNT (*) WHERE COUNTRY=?查询数据库SELECT COUNT (*) WHERE COUNTRY=? 每次我添加一个项目并以这种方式执行策略。

有更好的解决方案吗?


想到几个解决方案。 你似乎旨在保持前N个条目,并选择计数(*)国家..可能是解决这个问题。 您可以为加拿大的每个条目分配计数器(1,2,3 - ),但这会导致一批严格的数据。在MSSQL上,您可以创建类型“而不是”的触发器,计数发生次数并接受/拒绝根据计数。 您可以接受所有输入,将其存储在数据表中,并仅根据查询或查询显示前100个输入。

Ketil


因为世界上只有大约200个国家,如果你为每个城市增加100个城市,那么你可以使用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--

并在您的应用程序中使用返回的值来确定是否添加更多城市以及更多。


我设法只使用触发器做一个解决方案。 在这个例子中,我强制限制每个类别最多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;

我没有尝试过优化代码,我也不知道它如何在更大的表中执行。

链接地址: http://www.djcxy.com/p/35039.html

上一篇: to N items capacity for a database

下一篇: Distributed database for tree structured data?