-1

我们正在构建一个有目的地的旅行应用程序。我们想要存储一年中某个特定地点的哪些月份适合游览。我们将实施一种搜索模式,用户可以在其中选择一个月,我们应该提供最适合在那个月或几个月内旅行的地方。

我试过什么?

places(id, name, ....)

months (id, name)

places_months(id, place_id, month_id)

这是正确的方法还是有任何更聪明的方法来存储和检索相同的内容。

在显示月份时,我还想表明从一月到四月这个地方很适合参观,而不是一月、二月、三月、四月。

4

2 回答 2

2

在特定月份“好去处”是(a)主观和(b)不是二元决定。

我建议你的“时间表的目的地质量”,你称之为places_months结构如下。请注意,我建议一个月使用一个简单的小整数。您不需要仅用于月份名称的代码表。

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或类似的方式进行查询。

于 2013-02-04T13:19:01.263 回答
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个建议。

于 2013-02-04T09:04:42.087 回答