2

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

因此,作为一个简化示例,如果数据库有 2 列 -COUNTRY并且CITY,它应该有不超过 100 个来自“加拿大”的城市和不超过 100 个来自“美国”的城市。如果我已经有来自“加拿大”的 70 个城市并且想再添加 35 个,我应该只添加 30 个,然后停止在数据库中接受“加拿大”的新城市。

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

有更好的解决方案吗?

4

3 回答 3

2

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

凯蒂尔

于 2013-05-17T08:49:09.057 回答
1

因为世界上只有大约 200 个国家,如果你为每个国家添加 100 个城市,就会给你 20.000 条记录,这不是很多,所以你也可以使用COUNT(*)for 寻找是否可以添加更多城市,但如果你想每个国家/地区添加超过 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--

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

于 2013-05-17T08:52:54.353 回答
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;

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

于 2013-12-05T08:48:14.413 回答