要解决的问题: 我是DataBases的新手,我试图找出在表中存储更改的最佳方式,这是一些状态的每日快照:例如。 “hotel_room_rentals”表(有20列 - 每个都可以更改)。 我希望能够在选定的一天生成该表(例如,生产中的变更数据,因此我必须将其存储在其他地方),或者对其进行一些其他转换(例如,在一段时间内租用的平均天数)< / p>
我的理论范例 - 详细: 让我们说我为酒店创建一个数据库。 在生产系统中,我有一张桌子,显示酒店所有10000间客房的信息。 这是每日快照 - 我们假设该表每天更新一次。
房间的某些属性经常发生变化:例如is_rented; customer_number,rate_usd。 某些属性不会经常更改:例如disabled_room,room_color,type_of_furniture。 Room_number显然不会改变(主键)
现在我想找到跟踪此表中更改的最佳方法;在此表格的基础上创建统计数据的最佳方式(例如,在一段时间内租用的平均天数)以及能够生成所选日期的表格(例如2013-01-01)
我的想法: 由于我对数据库一无所知,我的想法是每天复制整个表,再添加1个列,名为“DB_dump_date”(带有日期)。这是一种非常简单的方法,可能需要很大的空间;因为我的10k房间的桌子,一年必须复制365次。
其他解决方案: 在其他一些网站上,我被建议创建两个表: 带有以下列的“预订”表:Startdate Enddate Room Rate Occupant_name 然后将此表转换为FactReservations表:Date Room Is_occupied Rate Occupant_name 我不明白这对我有什么帮助...实际上我假设我必须制作20个中间表然后20个Fact表(因为我的数据库中有20列)。
问题: 处理此类问题的推荐方法是什么? 是否有任何数据库架构准备处理它,而无需用户制作神奇的ETL? (例如,可以自行优化问题的数据库) 有哪些替代方案? 聪明的人,你会这样做吗? (最好是在MS Access ......或者一些免费软件技术中)
修改 还有一件事 - 桌子上的一切都可以改变,不仅仅是房间储备,一切;我希望能够跟踪变化
答案 0 :(得分:2)
停止 - 减速 - 然后喘口气。
不要 - 重复不要每天复制表格。这种做法远离基础。
您的问题是规范化问题。正如您所指出的那样 - 您有关于如何规范化的其他建议 - 这是您想要的方向。
您的目标是找到一个容纳可以回答您问题的SQL语句的结构(希望还有更多您尚未想到的)这将是一个静态模型,其中表不会更改或被复制,而是静态 - 而唯一改变的是表格内的数据。 (理想情况下 - 对我来说也会有很少甚至没有更新,只有插入)
你当然需要一个ROOM表和一个CUSTOMER表,然后它们之间的关系可能是RESERVATION。
这些可以填满 - 你可以得到你提出的问题的所有答案,而无需任何复制或实现或任何东西......只是SQL。
答案 1 :(得分:2)
您需要关注需求并从那里开始。到目前为止,我看到的要求是:
- 生成所选日期的表格
- 在一段时间内租用的平均天数
如果我们考虑两个极端的设计,在更复杂的一端将是带有SCD表的数据集市,跟踪房间的变化,并且在简单的一端将是某种日志表,沿着您已经拥有的线路提及。
在两行之间阅读,我并没有真正看到在某一天知道房间属性的任何要求,但我确实看到了分析历史交易的要求。
因此,在开始设计数据库之前,我的建议是很难考虑您的要求。
没有神奇的设计可以自动覆盖。维度设计是对业务数据进行建模的标准方法,以便于分析,但它可能超出您的要求。
答案 2 :(得分:1)
欢迎来到数据库世界!考虑到这一点 - 几乎所有关于Excel的知识都会被抛到窗外。虽然在Excel中定义两张工作簿之间的关系并报告这两张不同的工作表要困难得多,因此大多数时候只需简单地将相同的数据复制到一张工作表中,使用它很容易访问或任何其他关系数据库。
通常,您要做的是创建几个规范化表并定义它们之间的关系。然后,在查询视图时,您可以轻松地在表之间进行连接以获取所需的数据。
所以,假设你正在为简单的报告构建这个,而不是创建一个物业管理系统(如果你正在考虑这个 - 我建议你看看业内的一些参与者) ,像Micros或Agilysys),根据我在该行业工作的经验,我推荐以下表格布局:
就个人而言,我非常喜欢使用surrogate keys作为唯一标识符,因为我经常在业务流程发生变化的情况下被烧毁,以及之前独特的自然密钥突然可以重复。在这种情况下,每个表都有一个代理键,连接如下:
如果在Access中正确定义关系(即其他DBMS中的外键关系),则在创建查询(几乎所有其他DBMS中称为Views)或报告时,它应自动使用它们来构建连接。
要了解数据库,我建议您查看:
答案 3 :(得分:0)
如果您需要使用现有表格,则以下内容不适用。如果数据可以迁移到新架构,那么这将很容易解决这一挑战。 TRE是一种使用当前视图范例进行开发的方法,但完全支持数据的时间维度(系统时间=数据进入数据库时和有效时间=应用于数据的业务时间)。通过在TRE的当前视图方法中工作,这种问题很简单。看看: - http://youtu.be/V1EcsuJxUno