我正在寻找商店旅行的数据库。旅程有Location
,Mode
和Preferences
。 (所有这些都是实体或类)。我们现在假设每个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行具有相同的值。
可能是我的应用程序而不是我的数据库设计存在的问题?
感谢。
(抱歉我的基础英语)。
答案 0 :(得分:0)
看起来您的设计没有正确规范化,因此可能效率低下或导致数据维护问题。
从您的问题中说出来有点难,但似乎pref1
,pref2
和pref3
是不同的事物或状态,可能适用于或不适用于每次旅行。如果每次旅行都有或者没有有限数量的东西,那么你可能最好将事物(偏好)视为自己的表行,并使用交集表来指示哪些适用于每次旅行。< / 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.
)
这样的设计是一个更好的选择,因为它可以消除冗余,如果您决定扩大可能适用于旅行的偏好数量,它将来会更灵活。