此场景下,该选择关系型数据库还是NOSQL?

愚者只看星不看答案 2017-06-07 05:06:11
有点长请保存一点耐心。

业务场景:
系统需要用户可以自定义各种表单,然后收集各表单中输入的数据。假设现在有三种业务(实际中有哪种业务完全未知)
1、信用卡办理,要求提供 常住地址,婚姻状况(已婚 1,未婚 2,离异 3),房产信息(自有无贷款,租房,按揭)
2、带宽开户 要求提供 开户地址,速率(4M,8M)
3、婚姻登记 要求提供 男女方姓名,出生日期

由于需要的业务类型及需要的字段完全未知并且相同的业务,如婚姻登记在不同的时期需要收集的信息完全不同,例以后可能需要新增一个婚检状况的字段,
而带宽开户以后可能并不需要选择速率
基于此,所以不能按传统的关系数据库那样设计表(我并不希望通过编程的方式来创建相同类型但有着不同字段的表),
那么当前我的想法是在表中nvarchar(max)列上保存上述表单收集来的JSON

表结构(SQL Server):
create table test
(
id int identity(1,1) not null,
order_id int not null,
total_price decimal not null,
is_complete bit not null,
json_data nvarchar(max) not null
);

表数据可能是这样:
1 1 25.0 1 {"常住地址":"","婚姻状况":1,"房产信息":"租房"}
2 2 45.5 0 {"开户地址":"","速率":"4M"}
3 3 22.4 0 {"男方姓名","","女方姓名":"","男方出生日期","","女方出生日期":"",}


在SQL Server 2016中,为了提高在json_data列中保存的JSON数据的查询速度,可以通过创建一个依赖于JSON某属性值的计算列,然后再在计算列上编制索引

假设这里为了提高信用卡办理业务中的婚姻状况的查询速度,那么相应的表结构将是

create table test
(
id int identity(1,1) not null,
order_id int not null,
total_price decimal not null,
is_complete bit not null,
json_data nvarchar(max) not null,
婚姻状况 as cast(json_value(json_data,'$.婚姻状况') as int)
);

这里创建婚姻状况计算列,它的值来源于信用卡办理业务中的JSON数据的婚姻状况属性值
再在婚姻状况上创建索引

这样可以仅仅可以提高特定查询的速度,而且婚姻状况的计算列对于其它业务类型来说毫无意义,最重要的是,我不能再接着创建 速率,房产信息这样的计算列来提高查询的速度,更何况查询也有由用户定义出来的。


我对于NOSQL了解的并不多,请问此种场景下,是不是更适合于NOSQL来解决此类问题。多谢。
...全文
277 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 u012881998 的回复:
2楼没错,一种业务表单需要一张独立的表,只不过这个表不是事先设计好的,而是在上线后用户配置业务表单时动态创建的。 请参考各种 OA中审批工作流中的自定义表单的实现逻辑。
感谢回复,已经在cnblogs中回复你了
西漠以西 2017-06-08
  • 打赏
  • 举报
回复
2楼没错,一种业务表单需要一张独立的表,只不过这个表不是事先设计好的,而是在上线后用户配置业务表单时动态创建的。 请参考各种 OA中审批工作流中的自定义表单的实现逻辑。
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
为什么不一种业务设计一个表?
哥们,没有仔细 看题 。。
二月十六 版主 2017-06-07
  • 打赏
  • 举报
回复
为什么不一种业务设计一个表?
  • 打赏
  • 举报
回复
up.............

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧