“旅行偏好”,数据库设计

时间:2011-12-19 23:48:38

标签: database-design

我正在寻找商店旅行的数据库。旅程有LocationModePreferences。 (所有这些都是实体或类)。我们现在假设每个Trip只能有一个Preferences,而Preferences可以成为多次旅行的一部分。

现在,我已经用这种方式对其进行了建模:

Trips(id, attr1, attr2, ..., prefs);
Preferences(id, pref1, pref2, pref3);

其中'prefs'是FK(pref1,pref2和pref3是布尔类型)。

好的,当我存储一个pref1,pref2和pref3为true的旅行(id = 1),以及另一个具有相同首选项值的旅行(id = 2)时,我会有这样的事情:

+------+----+-------+-----+---------------+
| Trip | id | attr1 | ... | prefs         |
+------+----+-------+-----+---------------+
|      | 1  |   X   | ... | 10            |
+------+----+-------+-----+---------------+
|      | 2  |   X   | ... | 20            |
+------+----+-------+-----+---------------+


+-------------+------+-------+-------+---------+
| Preferences | id   | pref1 | pref2 | pref3   |
+-------------+------+---------------+---------+
|             |  10  |  True | True  | True    |
+-------------+------+---------------+---------+
|             |  20  |  True | True  | True    |
+-------------+------+---------------+---------+

问题是:是不是有很多冗余?假设我使用相同的首选项值存储100次旅行,那么我将在Preferences表中有100行具有相同的值。

可能是我的应用程序而不是我的数据库设计存在的问题?

感谢。

(抱歉我的基础英语)。

1 个答案:

答案 0 :(得分:0)

看起来您的设计没有正确规范化,因此可能效率低下或导致数据维护问题。

从您的问题中说出来有点难,但似乎pref1pref2pref3是不同的事物或状态,可能适用于或不适用于每次旅行。如果每次旅行都有或者没有有限数量的东西,那么你可能最好将事物(偏好)视为自己的表行,并使用交集表来指示哪些适用于每次旅行。< / p>

这样的事情:

Trips
( id
, attr1
, attr2
)

Preferences
( id
, description
)

Trip_Preferences
( trip_id
, preference_id
, value  -- If the value is true/false, then you have the option of leaving this out
         -- and just using the presence or absense of a record in this table as the
         -- indication of the value.
)

这样的设计是一个更好的选择,因为它可以消除冗余,如果您决定扩大可能适用于旅行的偏好数量,它将来会更灵活。