2011-12-19 54 views
0

我期待为商店旅行创建一个数据库。这些旅程有LocationModePreferences。 (所有这些都是实体或类)。现在假设每个Trip只能有一个Preferences,并且Preferences可以是多次出行的一部分。现在“旅程偏好”,数据库设计

,我已经以这种方式建模的:

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

其中 '首选项' 是一个FK(和PREF1,PREF2和pref3是布尔类型)。

好吧,当我存储跳闸(与ID = 1)PREF1,具有相同偏好值PREF2和pref3为真,并再次访问(使用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

看起来您的设计看起来并不正常,因此可能效率低下或导致您的数据维护令人头疼。

这是一个有点难以从你的问题告诉我们,但它似乎像pref1pref2pref3有可能适用或不适用于每趟不同的事物或状态。如果每次旅行的有或没有有限数量的东西,那么您最好将自己的东西(首选项)视为自己的表的行,并使用交叉表来指示哪些行适用于每次旅行。

事情是这样的:

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. 
) 

这样的设计是一个更好的选择,因为它消除了冗余,你应该决定扩大可以适用于旅行喜好的数量是为未来更加灵活。

+0

谢谢!我认为你的设计很好。 – 2011-12-21 23:03:57