我有2个数据库表:队和游戏

有关这个问题的目的,我们面对的是足球(足球)队和游戏。

每个游戏都只有2支球队,通常是主队和客队虽然偶尔两队可以是中性的。

我的问题是是否应该使用在游戏台2个的外键(home_team_id,away_team_id)表示这个数据关系或是否应使用与games_teams表多到多的关系的两个链接,在这种情况我还需要存储球队是否是家庭或客队,似乎有点矫枉过正。

要增加混乱,我使用的KohanaPHP ORM库和这些所期望的FK被称为TEAM_ID或链接表只包含2列。如果你有在KohanaPHP这个问题的经验,那么请留下一个答复,否则任何一般性的建议也大加赞赏。

有帮助吗?

解决方案

如果您希望能够固定您的数据库服务器上的“第X范式”的徽章,那么它也许应该被视为许多一对多的,否则,我想你会减少你的查询开销与1更少的表,你只是经历的你想一些有用的数据每的时间来参加。

其他提示

只需使用两列,否则你只需要限定它的木匠表。这并不是因为如果这是一个沉睡的定时炸弹,突然有一天你会发现你需要有一个真正的多对多的。

2列在我看来是完全合适的位置。事实上,只能有可能是两支球队的任何一场比赛是由具有两列反映在您的数据库架构。通过引入一个链接表,你介绍一个单一的游戏可以有2个队,2支客场强队的可能性,你会需要额外的验证,以确保这种情况不会发生。通过保持事物隔离于两列,您的架构本质上强制执行数据的完整性。

在正常化的术语:是。仅存在一个一对多或多对一的许多被分解为一个或多个一对多的关系。

不过,实事求是地说,如果我是救类似的性别。我真的需要一个多状态和日期时间戳附加到这个?

在令人惊讶的答案是肯定的 - 但前提是我需要跟踪出于商业原因,性别变化 - 最实用的目的,答案是NO

我会保持一个表有两个按键 - 除非有商业原因来跟踪它是这样

根据您如何抽象的话,我会说,足球比赛必须有两个团队,其中具有在游戏表中的列的情况下,不仅更方便,它更正确。

我甚至能想象球队的id是游戏的主键的自然部分。

完全认为你不应该有一个单独的表这一点。更容易对程序员更容易对DB。好去想什么IFS,但听起来好像你已经离开。不要陷入以为正常化总是去一切的方式。

我尊重其他的答案中说,使用两列是最好的选择,不过,你提到你正在使用中的Kohana ORM类。通过在游戏表使用两列就失去了ORM许多一对多的关系特征。如果你设置了一个games_teams透视表,你可以做到以下几点:

$game = ORM::factory('game', 1); // 1 is the game id

然后,您可以通过在那场比赛球队的循环:

foreach ($game->teams as $team) {
// do stuff with $team
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top