数据表设计
数据表设计
对于租房问题,我想最基本的分析需求包括:
(1) 查询某地区(region)某面积范围下(size)的租金价格: 此点应该是用户最开始关心的内容
(2) 比较两地区的租金价格
select region_id, size, price from table where region_id = xxx and size between x1 and x2;
(3) 某地区的租金随时间的变化关系 (时间维度应用)
(4) 房子尺寸与租金的关系,房屋朝向与租金的关系 (产品维度应用)
建立支持分析的数据表。对于租房信息的分析,非常适合数据仓库系统的特征
面向主题:租房
集成:这点主要指异构数据库的数据源分析,还是推荐microstrategy的产品吧
非更新的:中介通常会发布一个新的房源信息(新的url)而非更新已有url中数据
时间累积的:租房系统中的数据包含同一地区不同时间的发布信息
按照kimball的理论,采用非规范化的、维度的描述分析问题。
但另外一方面,对于获取的数据(网页爬取数据),通常具有较大的数据量,非规范化需要更多的存储空间(重复数据) 因此我的设计决定对于爬取数据(ODS层)和分析数据(WH层)采用不同的数据存储方式:
在ODS层采用规范化的数据范式
在WH层采用半规范化的存储方式
但这里这样做还有另外两个原因(考虑小本经营,搞两套表然后去转还是要花一些时间的):
1. 学习Kettle,或者说ETL工具的使用
2. 实践microstrategy的产品理念 (半规范化)
那么对于基本分析中的需求: (1) 地理位置信息 (2) 小区信息 (3) 时间信息 (4) 房屋信息
做一些简单扩展说明:
(1) 地理位置信息 ,例如 北京 - 海淀 - 西二旗 - 当代xx家园
地理信息是一个自然的继承关系
LU_CITY : CITY_ID, CITY_NAME
LU_DISTRICT : CITY_ID, DISTRICT_ID, DISTRICT_NAME
LU_LOCAL : CITY_ID, DISTRICT_ID, LOCAL_ID, LOCAL_NAME
LU_DETAIL_LOCAL : CITY_ID, DISTRICT_ID, LOCAL_ID, DETAIL_LOCAL_ID, DETAIL_LOCAL_NAME
(2) 小区信息:绿化率,供暖方式,开发商,开发时间, 具体地址
LU_DETAIL_LOCAL: 再添加 GREEN_RATE, WARM_TYPE, OPEN_TIME, OPEN_COMPANY_ID, SERVICE_COMPANY_ID
LU_OPEN_COMPANY: 存储比如 xxx开发商信息
LU_SERVICE_COMPANY: 存储比如 xxx物业信息
中介信息:姓名 联系方式 简介 (与房屋是多对多关系)
LU_AGENT: name, tel, introduction
教育信息 (尽管对租房用处不大,比如是否学区)
EDUCATION
(3) 时间信息:
在爬取层,时间信息并不需要过多的扩展,只需要存储房源的发布时间和爬取时间(发布时间
用于一定时间范围内的分析,爬取时间用于比较信息准确性),所以这部分在WH转换层做说明
在爬取层我只是把它作为最低level的事实表的一个字段做保存
(4) 房屋信息
名称 租金 户型 面积 朝向 楼层 楼龄 装修时间 信息来源 付款方式
HOUSE_RENT_INFO :
HOUSE_ID HOUSE_NAME ROOM_TYPE_ID STAIR_TYPE_ID DIRECTION_TYPE INFO_SOURCE_ID PAY_TYPE_ID
DECORATE_TIME
RENT_M SIZE_M
户型信息表
LU_ROOM_TYPE: ROOM_TYPE_ID, ROOM_NUM, SPACE_NUM (几室几厅)
楼层信息表
LU_STAIR_TYPE: STAIR_TYPE_ID, STAIR_NUM, MOST_STAIR_NUM (6/12)
信息来源表
LU_INFO_SOURCE: INFO_SOURCE_ID, INFO_SOURCE_NAME (链家)
付款方式表
LU_PAY_TYPE: PAY_TYPE_ID, PAY_NUM, LOAN_NUM (押一付三)
从事后的完成情况看,(1),(3),(4)与应用结合比较紧密,(2)的应用做的并不好。
一些相关的设计问题:
1. 比如对于绿化率,有些网站会写明百分比,有些网站则是用描述性,(通常是高,好,或者无描述),实际描述的是同一个概念,但是数据的整合遇到一定困难,这应该是ETL要处理的一部分内容
比如对于装修,有些网站会写2008年,有些会写五年以内,实际上是一回事,或者比如6楼中部,和3楼实际上是一回事,但是在处理前需要统一
或许这就是为什么数据库可以存储分类数据,而数据仓库中的数据必须经过汇总处理
2. 对于频繁查询的东西是否需要固化信息?
比如户型,单独是可以存在的,也可以存在房屋列中 -- 最终决定作为ID单独存在
3. 如何在数据库里实现同步插入呢
比如对下面三个表,在选取数据时能满足join操作要求,但在插入数据时候如何方便建表?
应该写类似如下的存储过程
if city.name doesn't exist, insert city.name, auto_increment city.id, record city.id;
else select city.id from LU_CITY where city.name = input_name
4. 如何确定哪些属性是表固有,哪些属性应该分不同表 --
关于建模的信息我拟参考ER模型相关知识
ER: 实体集,关系集,属性
是用实体集还是属性,如果是一对一关系,那么用属性,否则用实体集
比如身份证,年龄,作为人的属性
其实是实体集还是属性的分别是很模糊的,如果比较清楚的区分自然而然可以区分,而不清楚的应该本身就允许多种设计关系的存在,
户型可以作为房屋的属性,也可以作为单独的实体然后通过ID联系
5. 数据表的设计可能会随着业务的变化而变化
比如 学区房 信息, 当前是不需要的,但是如果是买房业务,学区房应该作为一个单独的条目存在
6. 比如题目中的信息是很难挖掘的,因为没有规范的格式,但同时也是很重要的,因为它基本说明房屋attractive的地方
例如:
随机抽取不同网站的题目,暂时只保存不处理
具体建模