MongoDB 咨询一下这个怎么建模

ShiningRay · 2013年07月24日 · 最后由 u1360749170 回复于 2013年11月19日 · 3929 次阅读

原来 mysql 是这样的建模的

省 > 市 > 行政区 > 商圈 > 商城 > 商店

大于号前面的 has many 后面的

原来比如我需要搜索某个城市所有的商店,可以通过 join 几次来查询(不考虑大数据量啊)

这样的模型在 mongodb 里面怎么做?

直接硬编码到配置文件吧...

#2 楼 @ShiningRay 反正数据量小啊,不用数据库也可以嘛

为什么一定要用 mongodb 呢?既然是文档数据库,什么才是你的文档?

#3 楼 @bhuztez 就是比如直接存城市的名字在 collection 里面?

#4 楼 @nouse 没有为啥啊,你的意思就是,这种应用场景不适合 mongodb?

#5 楼 @ShiningRay 数量小,而且基本不会变的数据,没必要用数据库吧。直接从配置文件中载入就够了啊。

state_of_county("Monroe", "New York").
state_of_county("Suffolk", "Massachusetts").
county_of_city("Rochester", "Monroe").
county_of_city("Boston", "Suffolk").

state_of_city(City, State) :-
  state_of_county(County, State),
  county_of_city(City, County).

#6 楼 @ShiningRay 我觉得不适合,pg 就挺好的

文档数据库很简单:要查什么样的结果,就存什么

#7 楼 @bhuztez 这样看起来也不错,反正是个固定的集合,那么比如像在商店的表里面就需要具体把省市都填进去了哦

用关系型数据库做很简单的样子..

#8 楼 @nouse Prolog 怎么了?挺好的啊,数据库(不管是 SQL 还是 NoSQL)的 DSL 基本也都是声明式语言。

少量数据,没有特殊需求,干脆存成 JSON 格式的字符串,用的时候再解析。 或者用 Nested Attributes http://mongoid.org/en/mongoid/docs/nested_attributes.html

仅仅这个需求,一个文档就是一个商店,然后这个文档包含所有属性,比如省,市,区等,都是平级的

#10 楼 @ShiningRay 地区这种基本不会变的东西硬编码就是了...比如@saberma 的 shopqi 的https://github.com/saberma/shopqi/blob/master/app/models/district.rb

好像是直接存商店 然后里面有省市信息,mongodb 也是类似关系型数据库的查询语句 这样就不用在单独维护城市列表了 啊哈哈哈

http://mongoid.org/en/mongoid/docs/querying.html 最好城市能是 id 这样能唯一 就可以用 where 查询了

大数据量下,可以考虑这样设计: 省 > 市 > 行政区 > 商圈 > 商城 这 5 层的 id 都用 bigint,用以下格式编号,共 13 位 11 01 01 001 0001

11 - 99 后面接 11 个 0,代表省一级,如:四川省 1100000000000,河北省 1200000000000, 1101 - 1199 后面接 9 个 0,代表四川省的市一级,如:成都市 1101000000000,绵阳市 1102000000000, 110101 - 110199 后面接 7 个 0,代表成都市的行政区一级,如:锦江区 1101010000000,高新区 1101020000000 110101001 - 110101999 后面接 4 个 0,代表成都锦江区商圈一级,如:春熙路 1101010010000,王府井 1101010020000, 1101010010001 - 1101010019999 代表春熙路下的商城 id

具体关联到商店时的 id,就会是 1101010010001 这一类 13 位的 id,当需要知道某个城市所有的商店,如成都市,只需要取到成都市的 id,1101000000000,然后再做查询即可:

city = City.find_by_name("成都市") Shop.where("upid > ? and upid < ?", city.id, city.id + 10 ** 9)

当然,如果要把最后一级商店的 id 做进来,那会更加方便一些,再加 4 个 0,做成 17 位的 id,如: 11010100100010001 代表四川省成都市锦江区春熙路太平洋百货 XXXX 化妆品专柜 不用外键,也可查询: Shop.where("id > ? and id < ?", city.id, city.id + 10 ** 13)

具体位数也可根据实际情况做增减。献丑,举个不恰当的例子哈。

当然省 > 市 > 行政区 > 商圈,这些分开存放也行,如省一级就存 11 - 99,两位数的 id,四川省 11,河北省 12 1101 - 1199 4 位数代表市,成都市 1101,绵阳市 1102,以下依此类推也是可以的。

支持 pg

#17 楼 @zfjoy520 好高端的样子

#20 楼 @ywencn 见笑了啊。。

#10 楼 @ShiningRay 只填最后一级就好了啊,别的都能从配置里查出来的啊

支持数字编码,类似邮编的设计

可以考虑一下 @zfjoy520 的建议 类似身份证,不过数据估计不少,全国所有行政区域,精确街道办/社区 这级 近 80 万条数据

#22 楼 @bhuztez 我觉得全部冗余进去好,如果有需求查某级(包含子)下所有条目 虽然可以类似 shop_table.area_code like '610326%' 来查,但这样不清楚 mongodb 能这样不,或能利用索引不。

#12 楼 @fenprace 纯 Prolog 的语义左递归就死循环了。当然这里没用到也没这个问题。所以现在不得不去看 datalog 语义是怎么实现的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号