存储季节的数据库设计

时间:2013-02-04 08:59:50

标签: database database-design

我们正在建设一个拥有目的地的旅行应用程序。我们希望存储一年中哪个月的特定地方值得参观。我们将实施搜索模式,用户可以选择一个月,我们应该提供最适合在这个月或几个月内旅行的地方。

我尝试了什么?

places(id, name, ....)

months (id, name)

places_months(id, place_id, month_id)

这是正确的方法,还是有更智能的方法来存储和检索它。

在显示月份的同时我还想表明,从1月到4月,这个地方很适合参观,而不是1月,2月,3月,4月。

2 个答案:

答案 0 :(得分:1)

我有几点建议:

首先(IMO)你应该在places_months上使用复合主键,并丢失id列。这可确保您始终拥有唯一的值对。并且关于范围的最后一个请求而不是几个月的列表:当你获得给定地点的月份列表时,可以在php中完成。这是完全有效的方法。

第二个(而不是上述)你可以包括范围。因此对于places_months,您可以使模式如下:

id, place_id, start_month, end_month
0     1           3           5
1     1           8           8

这意味着在place_id 1,从3月到5月和8月是好的。这将有助于您关于显示范围的最后一个请求(尽管在任何一种情况下这都不是很难用PHP。)

只有2条建议。

答案 1 :(得分:1)

在特定月份“善于访问”是(a)主观的,(b)不是二元决定。

我建议你按照时间表的“desitnation quality”,你称之为places_months的结构类似于以下内容。请注意,我建议一个月的简单小int。您不需要仅为月份名称的代码表。

create table places_months
(
  place_id int not null
, start_month tinyint not null
, end_month tinyint not null
, quality tinyint not null  -- Maybe a score from 0 to 5?
, comment varchar(100) null -- Reason why it is particularly bad (or good)
, constraint pk_places_months PRIMARY KEY (place_id,start_month)
, constraint ck_places_months CHECK (start_month<=end_month)
)

通过这样的表格,您可以提供更细微的答案。如果你仍然想要强制某种二元决策,你总是可以根据quality>=3或类似的东西进行查询。