【问题标题】:What is the best solution to set keys in this SQL table representing room rates of an accomodation service?在此 SQL 表中设置表示住宿服务房价的键的最佳解决方案是什么?
【发布时间】:2016-12-04 16:12:53
【问题描述】:

我不是很喜欢数据库,我有以下疑问:

我有这个 room_rate 表,它代表了一个住宿系统的预订率:

id                    bigint(20) unsigned   NO  PRI     NULL    auto_increment
rate_name             varchar(255)          NO          NULL    
rate                  double                NO          NULL    
date_from             datetime              NO  PRI     NULL    
date_to               datetime              NO  PRI     NULL    
id_room_tipology_fk   bigint(20) unsigned   NO  PRI     NULL    
time_stamp            datetime              YES         NULL    

我知道主键由以下字段组成:

1) id:一个自动递增的id。

2) date_from:开始日期。

3) date_to:教育日期。

4) id_room_tipology_fk:房间拓扑链接到另一个表。

此表的记录仅表示在 date_fromid_room_tipology_fk 表示)的房间的成本是多少/strong> 和 date_to 日期。

我想避免同一个房间的拓扑结构在同一时间范围内的表中有 2 条记录。

我在问是否使用以前的主键子集是好的,或者我是否必须排除 id 字段。

基本上我不能有这样的东西:

1    rate1    50    01/01/2017    10/01/2017    5   04/12/2016
2    rate2    70    01/01/2017    10/01/2017    5   06/12/2016

因为我不能在同一时间段内为同一房间类型 (5) 提供 2 个费率。

正确模拟这种情况的最佳解决方案是什么?

【问题讨论】:

  • 要处理时间范围,您将不得不在 MySQL 中使用触发器。
  • @GordonLinoff 不,也许我不清楚...该记录表示特定时间范围内的房间成本是多少。租房者不能在相同的时间范围内插入相同的价格……这是我必须建模的约束
  • @GordonLinoff 或者我错过了什么?
  • 。 .您是否考虑过不同的时间范围可能重叠,但又不完全相同?
  • @GordonLinoff 不,这不可能发生在我的要求中。我只需要在特定时间范围内记录特定房间类型。我该如何处理这种情况?

标签: mysql sql database primary-key rdbms


【解决方案1】:

根据 cmets 中的解释,您可以只使用唯一索引/约束。一个简单的方法是建立一个唯一索引:

create unique index unq_roomrate_room_datefrom
    on room_rate(id_room_tipology_fk, date_from);

这仅使用开始日期,但您也可以包括结束日期。

如果您愿意,可以将相同的检查放入表定义中:

constraint unq unq_roomrate_room_datefrom unique (id_room_tipology_fk, date_from);

【讨论】:

    【解决方案2】:

    假设该表没有相同的 id_room_tipology_fk 与重叠 date_from-date_to 范围:

    虽然 (id, date_from, date_to, id_room_tipology_fk) 可能是唯一的而不是 null,但它不是主键。因为 (id), (date_from, id_room_tipology_fk) 和 (date_to, id_room_tipology_fk) 都唯一地标识了一行,而它们中的任何一个都没有子集,所以它们都是候选键(声明为唯一不为空),您可以选择其中一个改为声明为主键。

    每个 interval-id_room_tipology_fk 对都是唯一的,因此它只能以它出现的一行中的一个速率出现。所以你不需要添加约束。

    但是如果不能保证不重叠,那么您需要使用您在触发器中声明的约束来强制执行它。请参阅Find date range overlaps within the same table, for specific user MySQL 的问题和答案。

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 2016-01-05
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多