存储两个一对一表的历史记录最有效的方式?

问题描述 投票:0回答:1

我有两张表,会员表和订阅表。假设架构如下

TABLE member {
  member_id integer [not null, pk]
  phone_number varchar(15) [not null, UNIQUE]
  membership enum(['STUDENT', 'STAFF', 'STAFF_SON']) [not null]
  name varchar(100) [not null]
  faculty varchar(64)
  email varchar(100)
}

TABLE subscription {
  member_id integer [not null, pk, ref: - member.member_id]
  active bool [not null]
  invoice varchar(256)
  subscription_date datetime [not null]
  expiration_date datetime [not null]
}

现在,如何存储订阅表的历史记录,以跟踪特定会员在课程期间的订阅变化?即,当会员续订时。

我尝试了很多东西,但我怀疑它们的效率。 我们称其为

subscriptions_record
,它应该与
subscriptions
具有一对多关系。这是我的第一个解决方案

TABLE subscription_records {
  id integer [pk]
  member_id integer [fk, ref: > subscription.member_id]
  invoice varchar(256) [fk, ref: > subscription.member_id]
  subscription_date datetime [fk, ref: > subscription.member_id]
  expiration_date datetime [fk, ref: > subscription.member_id]
}

这是一个好的解决方案吗?如果有任何有关如何改进我的方法的反馈或建议,我将不胜感激。

附注数据库最多将包含 20k 成员。

database database-design sqlalchemy flask-sqlalchemy
1个回答
0
投票

我将

subscription_records
视为订阅的审核历史记录。如果是这样,那么我建议还添加
last_modified_datetime
last_modified_user
列来记录上次更改订阅的时间和人员。

我也会把

active
栏放回去;如果用户将
subscription
标记为非活动状态,然后又恢复为活动状态?

你可以

delete
来自
subscription
的记录吗?如果是,那么您必须重新考虑是否要在
subscription_records
表上拥有外键。

确保您在

subscription
上以及随后在
subscription_records
上的插入/更新/删除操作是在一个事务中完成的

您可能还想在表中添加一个或两个索引,具体取决于打算如何查询它。

© www.soinside.com 2019 - 2024. All rights reserved.