在SQL中获得更好性能的不同方法。预订示例

在SQL中获得更好性能的不同方法。预订示例,sql,sql-server,sql-server-2008,sqlite,tsql,Sql,Sql Server,Sql Server 2008,Sqlite,Tsql,嗨,我是编程新手,尤其是数据库设计。 我刚刚开始使用数据库,我想知道这些设计中哪一个能给我更好的性能和更合理的设计。 我已经建立了如下预订酒店表: 为每次重新设置设置DateIn和DateOut 为每个房间/天设置旗帜 假设我们最多有100个房间,所以如果我想为第二张图片生成表(50年),大约需要15MB((100(房间)*8(位)+3(日期))*365(天)*50(年))的容量,但我认为当我想查询时,它会提供更好的性能。 第一张图片的查询比较复杂,我认为性能较差 如果你能告诉我原因或更好的

嗨,我是编程新手,尤其是数据库设计。 我刚刚开始使用数据库,我想知道这些设计中哪一个能给我更好的性能和更合理的设计。 我已经建立了如下预订酒店表:

为每次重新设置设置DateIn和DateOut

为每个房间/天设置旗帜

假设我们最多有100个房间,所以如果我想为第二张图片生成表(50年),大约需要15MB((100(房间)*8(位)+3(日期))*365(天)*50(年))的容量,但我认为当我想查询时,它会提供更好的性能。 第一张图片的查询比较复杂,我认为性能较差 如果你能告诉我原因或更好的方法,我将不胜感激。
提前感谢

我的意思是,它确实需要更多地考虑您如何计划访问和更改数据。我会在几乎所有情况下推荐第一种,但我不否认可能存在第二种更好的边缘情况。我怀疑你的情况是否如此

第一种方法为人们如何看待预订提供了一个更合理的近似值(这很好)——它还巧妙地编码了谁将在哪一天入住哪一间房间,并通过类似于预订信息、客人信息的想法将其与DB的其余部分联系起来。当您试图从所收集的数据中收集见解时,这些工具使您能够重新设想数据关系。例如。十年后,如果首席执行官说“嘿,我们历史上最受欢迎的一年日期是什么?使用“预订”模型,您可以轻松编写一个程序查询来查找。使用“日期/房间矩阵”模型,您将不得不手动检查每一列。总计

虽然第二种模式对于一家从不打算改变的酒店来说很好,但如果房间需要轮换摆放又该怎么办?另一张100列的带布尔型的桌子,哪些房间在哪几天向公众开放?将被占用与混乱混为一谈?如果你增加一个翼楼怎么办?你打算在这张桌子上再增加25列吗,等等?它可能会为您提供一些“哪些房间是可用的,您知道吗?”——但您将如何构建“哪些房间将在8月3日至6日可用”的查询


请记住,在关系数据库中,您要根据列中的值选择一组特定的行,而根据行值选择一组列要困难得多。

我的意思是,它确实需要更多地考虑您如何计划访问和更改数据。我建议您在几乎每种情况下都是e,但我不否认可能存在第二种情况更好的边缘情况。我怀疑你的情况是否如此

第一个为人们如何看待保留提供了一个更合理的近似值(这很好)-它还巧妙地对谁将在哪一天入住哪一间房间进行编码,并将其与数据库的其他部分联系起来,如预订信息、客人信息。当您试图从收集的数据中获取见解时,这些信息使您能够重新想象数据关系。例如,十年后,如果首席执行官说“嘿,我们一年中历史上最受欢迎的日期是什么?”?使用“预订”模型,您可以轻松地编写一个程序化查询来找到它。使用“日期/房间矩阵”模型,您必须手动检查每一列。真恶心

虽然第二种模式对于一家从不打算改变的酒店来说很好,但如果房间需要轮换摆放又如何呢?还有一张100列的布尔型桌子,在哪天哪些房间可供公众使用?把被占领和混乱混为一谈?如果你加一个翅膀呢?你打算在这个表中再添加25列吗?它可能会为您提供一些关于“哪些房间在8月3日至6日期间可用”的操作效率-但是您如何构造查询“哪些房间在8月3日至6日期间可用?”


请记住,在关系数据库中,如果要根据列中的值选择一组特定的行,则要根据行值选择一组列会困难得多。

不要使用重复的数据集。房间号不应该是它自己的列。顶部的集合看起来是您最好的选择。哦,您的空间计算(可能)是错误的-据我所知,在SQL Server上,它会自动将位列压缩在一起(压缩为一个字节值)。尽管如此,我还是支持@njk——我更喜欢第一个选项,尽管我会重命名您的日期列<代码>到达和
之前离开将是我的首选。不要使用重复数据集。房间号不应该是它自己的列。顶部的集合看起来是您最好的选择。哦,您的空间计算(可能)是错误的-据我所知,在SQL Server上,它会自动将位列压缩在一起(压缩为一个字节值)。尽管如此,我还是支持@njk——我更喜欢第一个选项,尽管我会重命名您的日期列<编码>到达和
之前离开将是我的首选。