【发布时间】:2016-06-23 10:42:45
【问题描述】:
我需要为我们的客户设计一个调查系统。
它基于asp.net,使用的数据库是oracle。
我在这里没有经验,所以我想就以下方面寻求建议:
- 使用什么数据库架构来存储用户答案,恐怕我目前的设计可能存在性能问题...
关于调查:
- 将同时进行两项或多项调查。
- 调查可能每年触发一次或更频繁,因此我认为我需要一个调查周期表。
- 调查针对不同的产品,因此产品和调查之间会有映射
目前我的设计:
调查类别表
+------------+--------------+
| CatageryId | CatageryName |
+------------+--------------+
| 1 | cat1 |
| 2 | cat2 |
+------------+--------------+
调查类别版本表
+-----------+------------+--------------------+
| VersionId | CatageryId | VersionDescription |
+-----------+------------+--------------------+
| 1 | 1 | 'cat1 version1' |
| 2 | 1 | 'cat1 version2' |
| 3 | 2 | 'cat2 version1' |
+-----------+------------+--------------------+
调查周期表
+----------+--------------------+
| PeriodId | PeriodDescription |
+----------+--------------------+
| 1 | 'cat1 period2016' |
| 2 | 'cat1 period2017' |
| 3 | 'cat2 period2016' |
+----------+--------------------+
调查周期-版本对照表
+----------+-----------+
| PeriodId | VersionId |
+----------+-----------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
+----------+-----------+
版本-问题映射表
+--------------+------------+
| VersionId | | QuestionId |
+--------------+------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+--------------+------------+
版本-产品映射表
+-----------+-----------+
| VersionId | ProductId |
+-----------+-----------+
| 1 | 'prodA' |
| 1 | 'prodB' |
| 1 | 'prodC' |
| 2 | 'prodA' |
+-----------+-----------+
为了存储调查结果数据,我必须在记录行之间放置大量重复信息:
用户答案表
+----------+------------+----------+-----------+-----------+--------+-----------+
| AnswerId | QuestionId | PeriodId | UserId/Ip | ProductId | Answer | VersionId |
+----------+------------+----------+-----------+-----------+--------+-----------+
| 1 | 1 | 1 | 'adam' | 'prodA' | 'Yes' | 2 |
| 2 | 2 | 1 | 'Joe' | 'prodA' | 'Yes' | 2 |
| 3 | 1 | 2 | 'adam' | 'prodB' | 'A' | 3 |
+----------+------------+----------+-----------+-----------+--------+-----------+
我们期待这个系统有数十种产品和数千名用户。
所以假设有 30 种产品,5000 名用户,每次调查 50 个问题,每年进行 4 次调查
在当前设计中,每年将有 5000 * 4 * 50 * 30 = 3000 万条记录添加到用户答案表中, 我真的很害怕它是否仍然可以正常工作......那么有什么优化建议吗?
编辑 1: 按照建议在用户答案表中添加 VersionId 列。
【问题讨论】:
-
您的 Answer 表中没有 VersionId。你怎么知道这个答案属于哪个调查版本?您建议的卷可以由 Oracle 数据库管理。您可以计划根据 PeriodId 在答案表中实施分区。
-
@phonetic_man ,是的,你是对的,我会编辑添加一列...我还会找到有关分区的更多信息,非常感谢。
-
@phonetic_man,非常感谢您的帮助。读完这篇文章后,我想我会在 PeriodId 列上进行列表分区。希望不会有问题,因为我认为当前的数据库设计有点过于复杂......
标签: asp.net database oracle database-design schema