【发布时间】:2020-02-24 00:56:06
【问题描述】:
更新:第 1 部分 - 开始:
我们想要获取我们的客户数据,但是是哪种数据?他们没有指定!实际上我们想要一个动态的应用程序,管理员可以定义新问题(他可以设置答案的数据类型、长度和其他规则),他还可以停用旧问题!
(我不想使用 EAV 架构设计,但我找不到替代方式)
更新:第 1 部分 - 结束:
所以我决定创建一个测验应用程序,管理员可以定义他们的答案数据类型可以不同的问题!
示例:
问题 ID 1:你叫什么名字? 回答:约翰(varchar)
问题 ID 2:你几岁? 答案:25 (整数)
问题 ID 3:你每小时的工资是多少? 答案:30.65 (十进制)
问题 ID 4:描述一下你自己? 回答:我太客气了……(文字)
更新:第 2 部分 - 开始:
为了保存我想到的答案,有 3 个选择:
更新:第 2 部分 - 结束:
- 创建这样的表(EAV 架构设计):
Table profile_answers
id int [pk, increment]
question_id int
profile_id int
answer text
如您所见,我已将所有答案保存为 文本! 我知道它有效,但这是最好的方法吗?实际上这个应用程序将有数百万个答案,我们想通过机器分析答案(例如:获取客户平均年龄、结婚客户、薪水 > 30.52 的客户等) 所以我想要以最佳性能的方式实施!
- 创建这样的表(EAV 架构设计):
Table answers
id int [pk, increment]
question_id int
profile_id int
integer_value int
decimal_value decimal
varchar_value varchar
boolean_value boolean
longtext_value longtext
现在我可以将数据保存在正确的字段中,并将 NULL 放入其他字段(答案的数据类型将在定义问题时确定)
例如:
question ID 1 : what is you name? answer: John (varchar)
id 1
profile_question_id 1
profile_id 1
integer_value NULL
decimal_value NULL
varchar_value John
boolean_value NULL
longtext_value NULL
----------------
question ID 2 : how old are you? answer: 25 (integer)
id 2
profile_question_id 2
profile_id 1
integer_value 25
decimal_value NULL
varchar_value NULL
boolean_value NULL
longtext_value NULL
----------------
question ID 3 : how much is your salary per hour? answer: 30.65 (decimal)
id 3
profile_question_id 3
profile_id 1
integer_value NULL
decimal_value 30.65
varchar_value NULL
boolean_value NULL
longtext_value NULL
更新:第 3 部分 - 开始:
- 当管理员添加新问题时,我可以在答案表中添加一列(更改表的架构)like this
更新:第 3 部分 - 结束:
一切都与性能有关!最好的方法是什么? 如果它们都不是最好的并且我应该重新设计数据库正确的数据库设计是什么?
【问题讨论】:
-
如果分析期间的性能是您的首要任务,则使用变体 2。当然,您可以仅填写答案数据类型字段,或具有兼容数据类型的所有字段(字符串 - 仅文本,日期 - 文本和日期, integer - 在文本中,十进制和整数,...)。
-
@Akina 所以你确认第二种方法是最好的解决方案吗?
-
如果你专注于你的优先事项,是的。
-
EAV 架构设计是一场噩梦。慰问。
标签: mysql database database-performance entity-attribute-value