MongoDB 咨询一下这个怎么建模

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

原来mysql是这样的建模的

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

大于号前面的has many后面的

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

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

共收到 27 条回复

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

#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语义是怎么实现的

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