索引 / 唯一约束
UNIQUE push_subscription_active (device_id, user_id, kind) WHERE revoked_at IS NULL
push_subscription_user (user_id) WHERE revoked_at IS NULL
触发器
CREATE TRIGGER push_account_devices_capacity BEFORE INSERT ON push_subscriptions
WHEN NEW.revoked_at IS NULL
AND NOT EXISTS (SELECT 1 FROM push_subscriptions WHERE revoked_at IS NULL AND user_id=NEW.user_id AND device_id=NEW.device_id)
AND (SELECT COUNT(DISTINCT s.device_id) FROM push_subscriptions s JOIN push_devices d ON d.device_id=s.device_id
WHERE s.revoked_at IS NULL AND d.disabled_at IS NULL AND s.user_id=NEW.user_id)>=10
BEGIN SELECT RAISE(ABORT, 'push account capacity'); END
CREATE TRIGGER push_device_accounts_capacity BEFORE INSERT ON push_subscriptions
WHEN NEW.revoked_at IS NULL
AND NOT EXISTS (SELECT 1 FROM push_subscriptions WHERE revoked_at IS NULL AND device_id=NEW.device_id AND user_id=NEW.user_id)
AND (SELECT COUNT(DISTINCT user_id) FROM push_subscriptions WHERE revoked_at IS NULL AND device_id=NEW.device_id)>=10
BEGIN SELECT RAISE(ABORT, 'push device capacity'); END
CREATE TRIGGER push_fills_capacity BEFORE INSERT ON push_subscriptions
WHEN NEW.revoked_at IS NULL AND NEW.kind='fills'
AND NOT EXISTS (SELECT 1 FROM push_subscriptions s JOIN push_devices d ON d.device_id=s.device_id
WHERE s.revoked_at IS NULL AND d.disabled_at IS NULL AND s.kind='fills' AND s.user_id=NEW.user_id)
AND (SELECT COUNT(DISTINCT s.user_id) FROM push_subscriptions s JOIN push_devices d ON d.device_id=s.device_id
WHERE s.revoked_at IS NULL AND d.disabled_at IS NULL AND s.kind='fills')>=5
BEGIN SELECT RAISE(ABORT, 'push fills capacity'); END