2

さまざまなデータをキャッシュするデータベースがありますが、大きくなりすぎないようにする必要があるため、保持する同じタイプのアイテムの数に制限を設け、その後新しいアイテムを拒否する必要があります。

簡単な例として、データベースに と の 2 つの列がある場合、COUNTRYCITYカナダ」の都市は 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 に答える
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 に答える