分享
如何设计SQL,表的字段属性经常要变动?
目前做统计数据的项目,统计每个地理位置(如:市、县、村等)所包含的数据(如:光纤数据、无线数据),使用mysql数据库。按照原来的思路,抽象实体-关系,把地理位置表做主表,统计的数据做分列表。Question:我每增加一项新的统计,都是需要更改mysql表来完成的,过一段时间,肯定当要“表哥”(如图,已经有4张表,兴许会有N张T_T)Help:希望能够把设置统计属性的权限交给系统用户,用户可以随意设置统计项,并再对统计项填报数据。当然,也需要对这些数据快速查询、统计啦PS:是不是nosql比较适合做这样的事情?希望指一条明路~~
回复 ( 2 )
我理解的你的问题和需求,其实并不复杂,用不用nosql,用哪种类型的nosql,都没有一定的答案。
继续使用mysql的话。把地理位置存一个表,然后建立另一个表,叫做features,存储不同的feature,也就是你所有的统计项,你每增加一个项目,就可以在这个表里添加一个记录;然后每个地理位置和每个统计项关联,创建第三个表,也就是<地理位置-统计项名称-统计项数值>这样的结构。这样一共需要3张表搞定。然而这样你每次通过一个地理位置希望看到其相关的所有统计项的时候都需要做连接查询。不过这种程度的连接关系型数据库来说不是问题。
如果地理位置不多,但是每个地理位置关联的统计数据很多,希望对于一个给定的地理位置,能够快速的一次性得到所有数据,则也可以使用mongodb这类文档型数据库,这个时候只要地理位置的集合,然后每个地理位置是一个文档,它的每个统计项都是作为文档的一部分直接关联在那个文档中的,并且每个地理位置不需要有统一的统计项模式,就类似json对象和属性,文档的结构完全是可变的,集合中的每个文档都可以有自己的结构。这种方案的好处,就是通过一个地理位置来检索,可以直接得到所有地理位置相关的数据,不用做连接查询。
当然用不用nosql数据库还有其他因素需要考虑,例如你的数据的读请求和写请求的比例;是否要支持事务;以及是否需要查询制定经纬度范围的地理信息查询(可以通过分别存储经度和纬度然后加索引)等等。
用不用nosql在一定程度上基于你的数据量/并发/延迟和查询方式
nosql在使用上肯定没有sql在数据关系结构上方便,你这种情况,考虑是否用nosql要慎重。
另外,用sql可以把这些数据放到一个json存一个column里面,然后你可以自由加减,前提是这个数据量不会特别大,sql中每个column大小是有限制的。
nosql一般都是key/value pair, 如果你的数据量特别大(百万级),对延迟要求高的话,可以考虑,不过设计起来比sql要复杂一些。