würde ich nicht Umgang mit diesem im Datenbankschema vor. Behandeln Sie es stattdessen in der data model.
Faustregel ist nicht erzwingen Geschäftsregeln in das Schema; sie ändern sich zu oft. Stattdessen sollte das Schema die Integrität der Daten erzwingen. Beispielsweise sollte das Schema sicherstellen, dass jede Einladung einem einladenden Benutzer, dem eingeladenen Benutzer und einem Ereignis zugeordnet ist. Wenn einige davon weggehen, sollte die Einladung weggehen. Das schützt die Datenintegrität. Eine Geschäftsregel ist etwas wie "Namen können nur 20 Zeichen lang sein" und ermutigen die übermäßige Verwendung von etwas wie name varchar(20)
.
Erzwingen Sie stattdessen die Regel in Ihrem Datenmodell, etwa User.add_invitation
. Dies wird wesentlich einfacher zu ändern sein, wenn sich die Geschäftsregeln ändern, es liefert bessere Fehlermeldungen darüber, warum der Versuch, eine Einladung hinzuzufügen, fehlgeschlagen ist, und erlaubt es verschiedenen Anwendungen mit unterschiedlichen Regeln, das gleiche Schema zu verwenden.
Dies setzt voraus, dass die Änderung der Datenbank ein Modell durchlaufen wird. Wenn Sie mit Code Änderungen an der Datenbank vornehmen, kann es pragmatisch sein, die Geschäftsregeln an einer Stelle zu verschlüsseln: das Schema.
Sie hat nicht gesagt, welche Datenbank Sie verwenden, also werde ich eine gute Entscheidung für Sie machen und annehmen, dass es Postgres ist. Es hat großartige Möglichkeiten für Trigger und Constraints. (Ich sehe, Sie sind auf MS SQL Server, der Code sollte sehr ähnlich sein.)
Wenn Sie dies im Schema tun, möchten Sie wahrscheinlich eine before insert
trigger, dass raises an exception, wenn es zu viele Einladungen.
Angenommen, Sie haben ein Schema mit Benutzern, Ereignissen und Einladungen.
create table users (
id bigserial primary key,
name text not null,
...whatever...
);
create table events (
id bigserial primary key,
...whatever...
);
create table event_invitations (
host bigint references user(id),
guest bigint references user(id),
event bigint references events(id)
);
Jeder Benutzer kann nur 10 Personen gleichzeitig zu einem Ereignis einladen. Verwenden Sie dazu einen before insert
Trigger, um die Einfügung zu blockieren, wenn bereits 10 Einladungen vorhanden sind. Mein pl/pgsql ist ein bisschen rostig, aber es ist so etwas wie diese:
create function limit_event_invitations_to()
returns trigger as $$
declare
invitations_count integer;
begin
select count(*) into invitations_count
from event_invitations
where host = NEW.host and event = NEW.event;
if invitations_count > TG_ARGV[0] then
raise 'User %d has too many invitations to event %d', NEW.host, NEW.event
using errcode = 'check_violation';
end if;
return NEW;
end;
$$ language plpgsql;
create trigger limit_event_invitations
before insert on event_invitations
for each row execute procedure limit_event_invitations_to(10);
Im Grunde tun, um eine Zählung, wie viele Einladungen ein Benutzer bereits für ein Ereignis gesendet, und wenn es über der Grenze ist erhebt eine Ausnahme. Dies sollte sehr schnell sein, da es sich nur um indizierte Fremdschlüssel-Lookups handelt.
Ich wählte the check_violation
error code, weil es das nächste Äquivalent zu dem ist, was Sie tun. Auf diese Weise können Sie einen bestimmten Ausnahmetyp erkennen, ohne eine Fehlermeldung analysieren zu müssen.
Bitte zeigen Sie die Abfrage, Tabellenschemas und gewünschte Ausgabe. –
ich denke immer noch über das Tischdesign nach. – birdseed
Was ich in Erwägung ziehe, sind die Spalten [residentname, residentaddress, visitornumber, visitorcode, visitorname], und dann würde ich im Programm manuell [visitornumber] indizieren und alle Zeilen löschen, die über der eingestellten Nummer liegen.das scheint ein bisschen komplex tho. – birdseed