0

要解决的问题: 我是数据库新手,我试图找出在表中存储更改的最佳方法,即某些状态的每日快照:例如。“hotel_room_rentals”表(有 20 列 - 每列都可以更改)。我希望能够为选定的日期生成该表(例如,生产变化中的数据,所以我必须将其存储在其他地方),或者对其进行一些其他转换(例如,一段时间内租用的平均天数)

我的理论示例 - 详细: 假设我为一家酒店创建了一个数据库。在生产系统中,我有一个表格,显示酒店所有 10 000 间客房的信息。这是每日快照 - 假设该表每天更新一次。

房间的某些属性经常变化:例如 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 个事实表(因为我的数据库中有 20 个列)。

问题: 处理此类问题的推荐方法是什么?是否有任何数据库模式可以处理它,而无需用户制作神奇的 ETL?(例如,可以自行优化问题的数据库)有哪些替代方案?聪明的人,你会怎么做?(最好在 MS Access... 或一些免费软件技术中)

编辑: 还有一件事 - 桌子上的一切都可以改变,不仅仅是房间预订,一切; 我希望能够跟踪更改

4

4 回答 4

2

停下来——放慢速度——深呼吸。

不要 - 重复 不要每天复制表格。这种方法太离谱了。

您的问题是标准化问题。正如您所指出的-您对如何规范化还有其他建议-这是您想要的方向。

您的目标是找到一种结构,该结构可以容纳可以回答您的问题的 SQL 语句(希望还有更多您尚未想到的问题) 这将是一个静态模型,其中表不会更改或被复制,但而是静态的——唯一改变的是表中的数据。(理想情况下 - 对我来说,更新也很少甚至没有,只有插入)

您肯定需要一个 ROOM 表和一个 CUSTOMER 表,然后它们之间的关系可能是 RESERVATION。

然后这些可以填满 - 你可以得到你提出的问题的所有答案,而无需任何复制或物化或任何东西......只需 SQL。

于 2013-03-24T22:57:57.803 回答
2

您需要关注需求并从那里开始。到目前为止,我看到的要求是:

- 为选定的一天生成该表

- 平均租用天数

如果我们考虑两个极端的设计,在更复杂的一端将是一个带有 SCD 表的数据集市,用于跟踪房间的变化,而在简单的一端将是某种日志表,就像您已经提到的那样。

从字里行间看,我真的没有看到任何了解特定日期房间属性的要求,但我确实看到了分析历史交易的要求。

所以我的建议是在你开始设计数据库之前仔细考虑你的需求。

没有神奇的设计可以自动覆盖这一点。维度设计是对业务数据进行建模以方便分析的标准方法,但它可能超出您的要求。

于 2013-03-24T23:51:59.847 回答
1

欢迎来到数据库的世界!考虑到这一点 - 把你所知道的关于 Excel 的几乎所有东西都扔到窗外。虽然在 Excel 中定义工作簿的两个工作表之间的关系并从这两个不同的工作表中报告要困难得多,但大多数情况下,简单地将相同的数据复制到单个工作表中会更容易,使用起来非常容易Access 或任何其他关系数据库。

通常,您想要做的是创建几个规范化表并定义它们之间的关系。然后,在查询视图时,您可以轻松地在表之间进行联接以获取所需的数据。

因此,假设您正在构建它是为了简单的报告而不是创建一个物业管理系统(如果您正在研究这个 - 我建议您看看该行业的一些参与者,例如 Micros或 Agilysys),根据我在该行业的工作经验,我推荐以下表格布局:

  • 预订 - 这包含预订信息(客人姓名、抵达日期、离开日期、入住日期、退房日期、使用混合房价的房价等)
  • 房间 - 这包含关于您的机架的信息(数量、翼代码、最大客人数、# 床、吸烟/不吸烟、视图、类型等)
  • 房间状态 – 仅当您需要跟踪房间是否处于预订/保留/OOO/OTM 时(状态类型、日期开始、日期结束)
  • 房间状态类型——房间状态的类型以及它如何影响库存(类型、库存不足标志)
  • 价格(如果您不使用混合价格)——每晚每次预订一次(客人,价格)

就个人而言,我非常喜欢使用代理键作为唯一标识符,因为我经常被业务流程中的某些变化所困扰,并且以前突然之间唯一的自然键可以被复制。在这种情况下,每个表都有一个代理键,连接如下:

  • 预订 - 房间(多对一)
  • 房间 - 房间状态(一对多)
  • 房间状态 - 房间状态类型(多对一)
  • 预订 – 价格(一对多)

如果您在 Access 中正确定义了关系(即其他 DBMS 中的外键关系),它应该在创建查询(在几乎所有其他 DBMS 中称为视图)或报告时自动使用它们来构建您的连接。

为了了解数据库,我建议您查看:

于 2013-03-25T19:47:58.910 回答
0

如果您需要使用现有表格,则以下内容不适用。如果可以将数据迁移到新模式,那么这将很容易解决挑战。TRE是一种使用当前视图范式进行开发但完全支持数据时间维度的方法(系统时间=数据进入数据库的时间,有效时间=适用于数据的业务时间)。通过使用 TRE 的当前视图方法,这类问题很简单。看看:- http://youtu.be/V1EcsuJxUno

于 2013-03-29T13:10:57.933 回答