2016-11-09 5 views
0

Ich baue eine Datenbank für eine kleine Organisation mit etwa 100 bis 200 Mitglieder. Diese Mitglieder müssen eine geringe Gebühr zahlen, um Mitglied zu sein.SQLite: Verwenden einer Tabelle als Basis für andere Tabellen

Ich habe eine Tabelle erstellt, in dem alle Einzelheiten der Mitglieder aufgeführt sind:

------------------------------------------ 
| First name | Last Name | Address | ... 
------------------------------------------ 
| John  | Smith  | Street 1 | ... 
| Jane  | Smith  | Street 2 | ... 
| ...  | ...  | ...  | ... 

Jetzt möchte ich eine Tabelle erstellen, in dem die Namen der Mitglieder angezeigt werden, und wenn sie dort Gebühr bezahlt:

---------------------- 
| Name  | Paid? | 
---------------------- 
| John Smith | yes | 
| Jane Smith | no | 
| ...  | ... | 

Hier kommt das Problem: Wenn ein neues Mitglied der ersten Tabelle hinzugefügt wird, sollte dies in der zweiten Tabelle widergespiegelt werden. Wenn ein Mitglied kein Mitglied mehr ist, muss dasselbe passieren.
Ich suchte im Internet nach Lösungen, aber konnte nur diejenigen finden, wo die Tabelle gelöscht und neu erstellt wurde, aber dies ist nicht wirklich praktikabel, da die Daten in der zweiten Tabelle wirklich wichtig sind. Wir möchten nicht, dass ein Mitglied, das bereits bezahlt hat, es erneut bezahlen muss.

Ich möchte wissen:

  1. Ist dies auch bei der Verwendung von SQLite möglich?
  2. Wenn es eine Lösung gibt, ist es garantiert, die Daten in der zweiten Tabelle an der richtigen Stelle zu halten?


P. S .: Nach dieser Frage zu schreiben, dachte ich an eine temporäre Tabelle erstellen, das Kopieren der Daten von der zweiten Tabelle, die ursprüngliche repopulating und dann die Daten aus der temporären Tabelle zu kopieren zurück. Dies scheint sehr hinterhältig und sehr schwierig mit einem Tool wie SQLiteStudio zu tun. Gibt es einen besseren Weg?

Antwort

1

Sie sollten mehr in Bezug auf Operationen an den Daten denken, als wie Sie es speichern.

Dies ist ein typisches Normalisierungsproblem. Es gibt so viele Tupel in Mitgliedern wie in bezahlt; Beide haben den gleichen Primärschlüssel. Sie sollten also beide Tabellen kombinieren.

Fügen Sie das Feld für Ihre Tabellenmitglieder hinzu und machen Sie es standardmäßig "Nein".

Zum Beispiel:

create table members(
    firstname text, 
    lastname text, 
    paid bool default false, 
    -- any other fields 
    primary key (firstname, lastname) 

);

und wenn Sie ein:

insert into members(firstname, lastname) values ('john', 'smith'); 

Sie erhalten:

| firstname | lastname | paid | 
|-----------+----------+-------| 
| john  | smith | false | 

Alternativ Sie einen bezahlten Tisch halten, einen Fremdschlüssel aus der Tabelle an die Mitglieder erklären (also jedes Tupel in bezahlt hat ein Tupel in Mitgliedern) und dann davon ausgehen, dass, wenn ein Mitglied nicht bezahlt ist, es nicht bezahlt hat. Andernfalls verwenden Sie den Wert des Feldes.

Verwandte Themen