SQLite:使用表作为其他表的基础

时间:2016-11-09 21:52:08

标签: sqlite database-design

我正在为一个拥有大约100到200名成员的小型组织建立一个数据库。这些成员必须支付少量费用才能成为会员。

我创建了一个表格,其中列出了所有成员的详细信息:

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

现在我想创建一个表格,其中显示成员的姓名以及他们是否支付了费用:

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

问题出现了:如果将新成员添加到第一个表中,则应在第二个表中反映出来。如果成员不再是成员,则必须发生同样的情况 我在互联网上搜索解决方案,但只能找到丢弃和重新创建表的地方,但这并不可行,因为第二个表中的数据非常重要。我们不希望已支付费用的会员必须再次支付费用。

我想知道:

  1. 使用SQLite是否可以实现这一点?
  2. 如果有解决方案,是否可以保证将第二个表中的数据保存在正确的位置?

  3. P.S。:写完这个问题之后,我想到了创建一个临时表,复制第二个表的数据,重新填充原始数据,然后将数据复制回临时表。对于像SQLiteStudio这样的工具,这似乎非常狡猾并且很难做到。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您应该在数据操作方面考虑更多,而不是存储数据。

这是典型的规范化问题。成员中的元组与付费一样多;两者都有相同的主键。所以你应该把两个表结合起来。

添加支付给您的表成员的字段,并默认设置为“no”。

例如:

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 |

或者,您可以保留付费表格,从该表格向成员声明外键约束(因此付费中的任何元组都有成员中的元组)然后假设如果某个成员没有付费,那么它还没有付款。 否则使用该字段的值。

答案 1 :(得分:0)

您可以使用SQLite支持的触发器。

下面的链接显示如何在插入数据上创建触发器:

下一个链接显示了如何在删除数据上创建触发器: