原来 mysql 是这样的建模的
省 > 市 > 行政区 > 商圈 > 商城 > 商店
大于号前面的 has many 后面的
原来比如我需要搜索某个城市所有的商店,可以通过 join 几次来查询(不考虑大数据量啊)
这样的模型在 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).
#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
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,以下依此类推也是可以的。