我有一个充满企业的表格,每个企业都有可扫描的QR码,另一个表格存储着用户进行的扫描。现在,扫描表架构如下所示:
id | user_id | business_id | scanned_date
如果我想在我的应用程序的前端中创建图表和分析以获取有关业务扫描的统计信息,我只会获取business_id并获取其业务信息,但是问题是,如果业务数据是曾经发生过变化,那么统计数据也将发生变化,并且不应该这样。
要想拥有静态数据,我想到的第一件事就是将整个业务行作为JSON字符串存储在扫描表的新列中,但这听起来不是一个好习惯。 (尽管不建议您存储JSON String,否则数据将不会被篡改,因为它应该是静态的,因此不会被存储。)
我想到的另一件事是在业务表的架构之外创建一个克隆表,但这意味着每次我想对原始表进行更改时都可以工作两次,因为我还必须更改克隆表。 / p>
答案 0 :(得分:0)
希望我能回答你的问题。
您可以尝试在业务表中进行重复。与其编辑业务,不如尝试添加具有新ID的新业务。编辑业务时,您可以插入新业务,而不必更新现有业务。统计信息将使用旧ID,并且不会受到更改的影响。当您尝试获取最新的业务信息时,请尝试根据其ID对它们进行排序以获取最新的业务信息。这样,您将不需要第二张表来存储业务数据。
编辑::如果业务id
需要特定于业务,则可以添加一列来表示向表中插入数据,而不是使用业务ID。同样,您可以使用排序限制查询来获取最后一个查询。
编辑2:
删除在一定时间前插入的实体
如果您不需要一个月前的统计信息,可以将其从企业中删除以节省空间。您可以使用创建的新时间列来获取时差,并检查其是否大于所需范围。
答案 1 :(得分:0)
您需要一种方法来表示数据库中企业数据的历史记录。
您没有提到要存储在每个公司行中的属性,所以我会猜测。假设您有这些列
business_id
name
category
qr_code
website
您的问题是:如果更改业务的任何属性,那么旧的价值就会消失。
这是解决该问题的方法。将start
和end
列添加到表中。它们可能应该具有TIMESTAMP数据类型。
然后,永远不要从表中删除行。更新它们时,仅更改end
列的值。而是添加新行。让我解释一下。
要使行在NOW()时处于活动状态,必须通过以下WHERE条件:
start_date >= NOW()
AND (end_date IS NULL OR end_date < NOW())
假设您从表格中的两家公司开始。
business_id start end name category qr_code website
1 2019-05-01 NULL Joe's tavern lkjhg12 joes.example.com
2 2019-05-01 NULL Acme rockets sdlfj48 acme.example.com
好:您可以通过此查询每天计算QR码扫描次数
SELECT COUNT(*), DATE(s.scanned_date) day, b.name
FROM business b
JOIN scan s ON b.business_id = s.business_id
AND b.start >= s.scanned_date
AND (b.end IS NULL OR b.end < s.scanned_date)
GROUP BY DATE(s.scanned_date), b.name
现在,假设乔卖掉了他的小酒馆,名字也变了。要表示该更改,您必须为Joe's更新现有行以设置结束日期,然后使用新数据插入新行。然后,你的桌子看起来像这样
business_id start end name category qr_code website
(updated) 1 2019-05-01 2019-05-24 Joe's tavern lkjhg12 joes.example.com
(inserted) 1 2019-05-24 NULL Fancy tavern lkjhg12 fancy.example.com
(unchanged) 2 2019-05-01 NULL Acme rockets sdlfj48 acme.example.com
上面的查询仍然有效,因为它考虑了更改的开始和结束日期。
当扫描次数多于对企业的更改时,此方法最有效。在这种情况下,这似乎很有可能。
您的业务表需要一个复合主键(business_id,开始)。
教授理查德·斯诺德格拉斯(Richard Snodgrass)撰写了有关此主题的书用SQL开发面向时间的数据库应用程序,并慷慨地提供了pdf。