Sql server 个人数据库设计';s可用性

Sql server 个人数据库设计';s可用性,sql-server,database-design,relational-database,Sql Server,Database Design,Relational Database,我目前正在开发一个web应用程序,它将厨师的信息存储在用户表中。我们有一个从web应用程序中搜索厨师的功能。如果厨师在2016年5月3日不可用,我们希望在用户搜索2016年5月3日时显示该厨师的不可预订或不可用消息。我们提出的解决方案是创建一个名为CooksAvailability的表,其中包含以下字段 ID, //Primary key, auto increment IDCook, //foreign key to user's table Date, //date he is availa

我目前正在开发一个web应用程序,它将厨师的信息存储在用户表中。我们有一个从web应用程序中搜索厨师的功能。如果厨师在2016年5月3日不可用,我们希望在用户搜索2016年5月3日时显示该厨师的
不可预订
不可用
消息。我们提出的解决方案是创建一个名为CooksAvailability的表,其中包含以下字段

ID, //Primary key, auto increment
IDCook, //foreign key to user's table
Date, //date he is available on
AvailableForBreakFast, //bool field
AvailableForLunch, //bool field
AvailableForDinner, //book field
BreakFastCookingPrice, //decimal nullable
LunchCookingPrice, //decimal nullable
DinnerCookingPrice //decimal nullable
通过这个模式,我们能够判断用户是否在特定日期可用。但这种方法的问题是它需要大量的数据库空间,即如果一个厨师每年有280天的可用时间,那么必须有280行来反映一个厨师的可用时间

这是太多的空间,因为我们可能有数千名厨师注册到我们的应用程序中。你可以看到早餐、午餐和晚餐的烹饪价格场。这意味着厨师在不同的日期和时间烹饪可以收取不同的烹饪费用


目前,我们正在寻找一种智能解决方案,它能够满足我们的需求,并且比我们的解决方案占用更少的空间

要回答你的问题,我应该了解更多关于信息结构的信息。 例如,如果大多数厨师在某段时间内都有空,那么使用

avail_from_date-avail_to_date,而不是每天一行

这将减少行的数量

早餐、午餐和晚餐的不同价格可以更好地存放在厨师桌上,前提是价格每天都不一样。早餐、午餐和晚餐的供应量也是一样的,前提是每天的供应量不变


但是,如果您的信息结构需要为每个厨师每天保留一个记录,那么一年内的记录数将为365*280=102200,在我看来,这对于sql db来说不是太多。如果您将索引放在正确的位置,这将具有良好的性能。

您每天都在存储一条记录,而导致这种冗余设计的主要错误是您没有充分分离概念

我不知道一个厨师对一顿饭是否有一个预期的价格,也就是说,如果没有额外的信息,一个人通常可以假定的价格。如果是这样,那么您可以将这些默认价格存储在存储厨师的表中


让我们将可用性和具体价格存储在不同的表中。如果可用性不必存储价格,则可以存储可用性间隔。在另一个存储价格的表中,只需要存储偏离预期价格的价格。因此,您将在表中定义可用时间间隔、当价格与oter中的预期价格不同时的具体价格以及cook表中的默认用餐价格值,因此,如果没有特殊价格,将使用默认价格。

有几个问题有助于整体答案

  • 可用性多久改变一次
  • 价格多久变动一次
  • 是否有一般模式,例如,库克X可用于早餐和午餐,每周周一至周三
  • 在一定时期内是否有正常的可用性/价格, 但是否有短期的替代/差异
  • 如果可用性和价格以不同的速度变化,我建议您单独建模。这样,您只需要显示发生了什么变化,而不是复制不变的数据

    除此之外,还需要权衡空间/复杂性

    在一个极端情况下,您可以拥有一个相互覆盖的配置层次结构。因此,对于cook X来说,有一套规定,他们可以在日期1到2之间的星期一到星期三吃早餐。另外,库克X还有一套B,上面说他们可以在周四的第3天到第4天之间吃午饭。假设日期为1->3->4->2,您可以定义集合B是覆盖集合A还是添加到集合A。这是最简洁的,但是有相当多的业务逻辑需要解释


    在另一个极端,你只是说在约会1和2之间的cook X这件事是真的(服务的可用性,价格)。您会发现在给定日期内所有情况都是正确的,可能会带来几个单独的记录,例如周一的午餐供应情况、周一的午餐价格等。

    问题是厨师可以有不同的价格/天/餐。这意味着他可能会为2016年5月16日的早餐和2016年5月17日的早餐提供一种价格,例如,如果我们有10000名厨师,我们最终会有10000*280=2800000排(近300万排)。我相信这是不是太多了。请引导我,我不是db guyNo,如果你需要的话,一般不会太多。我的意思是,如果每天都有不同的价格或可用性,没有其他方法。但是,你必须分析和规范化你的数据:例如,在数据中没有日常差异,但通常-你必须将它们放在一个月表中…所以问题不是什么太大,问题是你需要什么来准确地存储真正的最佳信息。多大的空间就是多大的空间?