表与一对多关系或多对多?

时间:2013-12-30 18:26:19

标签: mysql sql database database-design

下面给出了表格的样子,

Place (id, name) i.e 1,Work | 2,Home | 3,College [lookup table]

UserPlace (id, placeId, contryId, userId),即1,2,1,12表示,id为1,地点为工作,contry为澳大利亚。用户ID为12

Transport (id, name) i.e 1,Bus | 2,Train | 3,Cycle [lookup table]

UserPlaceTransport (userPlaceId, transportId, distance)

将此数据的样本数据归属于一个用户。

1,1,10km - UserPlace id为1,即工作,Transpory方式为Bus。距离是10km

1,2,20km - UserPlace id为1,即工作,Transpory方式为Train。距离是20km

1,3,70km - UserPlace id为1,即工作,Transpory方式为Cycle。距离是70km

2,3,50km - UserPlace id为2,即home,Transpory方式为Cycle。距离是50km

4,3,40km - UserPlace id为3,即大学,Transpory方式为Cycle。距离是40km

根据这种结构,UserPlaceTransport表中存在一些小混淆。也就是说,还有获得价值的可能性 对于所有3个userPlaces在一起。这意味着,用户已达到这三公里的所有三个(工作,大学,家庭)。即20%的公共汽车,60%的火车和20%的循环

但目前表格结构仅适用于其他方式,即工作,公交车10%,火车90​​%..大学 - 公交车50%,周期50%

所以我想知道如何扩展数据库表以便存储这种类型的值。我的方法是采用两个单独的表格UserPlaceTransportBasic& UserPlaceTransportAdvanced 因此,UserPlaceTransportAdvanced将与之前相同,而UserPlaceTransportBasic将如下所示,

UserPlaceTransportBasic (userId, transportId, distance)所以这清除了混乱。

我想知道有没有更好的解决方案来处理这种情况。我的意思是没有创建两个单独的表但只有一个表。

由于

1 个答案:

答案 0 :(得分:1)

你是这样的:

  

根据这种结构,有一个小混乱   UserPlaceTransport表。也就是说,也有可能   获取所有3个userPlaces的值。这意味着,用户拥有   达到了这三公里(工作,大学,家庭)的这么多公里。即乘公共汽车   20%,火车60%,循环20%

我没有看到:UserPlaceTransport指定UserPlace和Transport,因此没有重复或混淆。

这张桌子还有另一个问题:它有一个旅程的一端,但没有另一个:如果UserPlace是工作是从大学或家里的距离?这可以通过添加指向所涉及的第二个UserPlace的另一个字段来解决。更好的解决方案是添加Journey表(id,FromUserPlaceid,ToUserPlaceId)并使用Journey表而不是UserPlaceTransport表。

或者您的问题是旅程可能涉及多种运输方式?如果是这样,请将距离和TransportId取出UserPlaceTransport(或Journey)表并添加表UserPlaceTransportSection(id,UserPlaceId,TransportId,distance)。你可以在UserPlaceTransport表中保留总距离,但这有点过早优化,所以我不愿意。

这有帮助吗?