我们想获取客户数据,但是哪种数据?没有指定!我们将问他们问题以获取数据!这些问题必须由管理员动态定义!我的意思是,在开发和管理员可以定义新问题(他可以设置答案的数据类型,长度和其他规则)时,未指定它们,并且他也可以停用旧问题! 我不想使用EAV模式设计!
我问了一个相关的问题here,但是我想尝试另一种方法,所以我添加了一个新问题,以免完全改变旧的问题!
这些问题与他们希望获得的服务有关:
[profiles
表(包含客户基本数据)]
id | name
---|----------------
1 | john
2 | tom
services
表
id | name
---|----------------
1 | lawn_mowing
2 | roof_insulation
现在这是我的主意:当管理员添加一个与area
服务相关的名为lawn_mowing
的问题,并且答案为整数时,系统的行为如下:
步骤1:
if ('lawn_mowing_answers' table not exists) {
system creates 'lawn_mowing_answers' table with just 2 columns called 'id' and 'profile_id'
} else {
go to next step
}
步骤2:系统向lawn_mowing_answers
添加一列,称为area
该表将是这样的:
id | profile_id | area (integer)
---|------------|---------------
| |
然后管理员添加一个名为“ owner_name”的问题,它与lawn_mowing
服务相关,并且答案是varchar,系统行为如下:
在lawn_mowing_answers
中添加名为owner_name
的列该表将是这样的:
id |profile_id| area (integer) | owner_name (varchar)
---|----------|----------------|---------------------
| | |
等等,管理员可以动态添加/编辑数据库架构!当个人资料回答问题时,数据将插入到lawn_mowing_answers
表中!
通过这种方式,我们可以灵活地添加新问题,并且我们不需要表之间的联接(性能更好的VS EAV模式设计!)!
我们有50多个服务,每个服务可以有40多个问题!我们考虑每天为超过100,000个客户插入和分析数据!和performance,这对我们来说是最重要的!
但是我不确定更改数据库架构是否是标准方法?
(我们正在使用laravel 6)
这种方法的好处是,您可以构建一个关系架构,该架构可能具有不错的性能,并且在数据存储方面非常有效。
缺点是您最终将编写应用程序以编写应用程序,这可能会变得异常复杂。您必须将应用程序代码连接到动态生成的架构,并且最终必须有效地从头开始编写对象关系映射器(ORM)。当然不是standard。