2016-11-09 56 views
0

我正在为大约100到200个成员的小型组织建立一个数据库。这些会员必须支付一小笔费用才能成为会员。SQLite:使用表格作为其他表格的基础

我创建其中成员的所有细节都列出一个表:

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

现在我想创建其中显示成员名称的表,如果他们支付有费:

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

问题出在这里:如果新成员被添加到第一个表中,这应该反映在第二个表中。如果一个成员不再是一个成员,同样的事情也必须发生。
我在互联网上搜索了解决方案,但只能找到表格被删除和重新创建的地方,但这不是真正可行的,因为第二个表格中的数据非常重要。我们不希望已经支付费用的成员必须再次支付费用。

我想知道:

  1. 这甚至可能与使用SQLite的?
  2. 如果有解决方案,是否保证将数据保存在第二个表格中的正确位置?


P.S:写这个问题后,我想创建临时表,复制第二个表的数据,重新填充原来,然后复制回数据从临时表的。这似乎非常狡猾,而且很难用像SQLiteStudio这样的工具来完成。有没有更好的办法?

回答

1

对数据的操作而言,您应该考虑更多,而不是如何存储它。

这是一个典型的归一化问题。成员中的元组数和付费数一样多。两者都有相同的主键。所以你应该结合两个表。

将支付的字段添加到您的表格成员中,并使其默认为“否”。

例如:

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

);

,如果你插入:

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

您将获得:

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

或者你可以保持一个支付表,申报从该表中成员外键约束(在这样的任何元组付费在会员中有一个元组),然后假设如果一个会员没有付费,那么它就没有付费。 否则使用该字段的值。