2016-11-01 3 views
0

Ich erstelle eine App, in der Benutzer (die sich bereits in einer anderen Tabelle befinden) eine festgelegte Anzahl von Besuchern haben können, die sie zum Standort einladen können. Was ist der beste Weg, um die Anzahl der Zeilen (in der Besucher-Tabelle) für jeden Benutzer zu begrenzen?Was ist die beste Methode, um Zeilen für einen bestimmten Benutzer zu begrenzen?

danke für den Rat.

+0

Bitte zeigen Sie die Abfrage, Tabellenschemas und gewünschte Ausgabe. –

+0

ich denke immer noch über das Tischdesign nach. – birdseed

+0

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

Antwort

0

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.

+0

Ich verwende C# und mssql. Ich glaube, dass ich verstehe. Zumindest verstehe ich das Konzept, aber lassen Sie mich eine oder zwei Nachfragen stellen. Was Sie im Grunde sagen, ist, dass meine Tabellen alle Daten enthalten müssen, die zum Halten erforderlich sind. aber ich kontrolliere diese Daten programmierbar. Deshalb kann ich das Programm immer ändern, aber wenn ich die Datentabellen einschränke, kann ich das vielleicht nicht immer ändern? wären meine Datentabellen das Datenbankschema und mein Code das Datenmodell? Entschuldigung, wenn dies neue Fragen sind. – birdseed

+0

@birdseed Ja, die Tabellen und Trigger und Constraints und all das ist das Schema. Das ist alles in SQL. Das Datenmodell ist Ihr Code, der mit der Datenbank kommuniziert und die Daten in Objekten anordnet und Methoden bereitstellt. Das Ziel ist, dass der Rest des Codes völlig unwissend ist, wie die Daten gespeichert werden. Wenn Sie eine Einladung hinzufügen möchten, fügen Sie nicht in event_invitations ... ein. Sie rufen 'event.add_invitation (host_user, guest_user)' und 'Event.add_invitation()' '' '' '' auf. Wenn Sie wissen möchten, welche Einladungen ein Benutzer hat, könnte es 'guests = event.guests (host_user)' sein. – Schwern

+0

Ich verstehe alles außer dem letzten Teil. Wie erstellst du das Event? – birdseed

Verwandte Themen