Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 两对多数据关系应该被视为多对多吗?_Php_Mysql_Database_Kohana_Foreign Key Relationship - Fatal编程技术网

Php 两对多数据关系应该被视为多对多吗?

Php 两对多数据关系应该被视为多对多吗?,php,mysql,database,kohana,foreign-key-relationship,Php,Mysql,Database,Kohana,Foreign Key Relationship,我有两个数据库表:团队和游戏 就这一问题而言,我们讨论的是足球队和比赛 每场比赛有2支球队,通常是主队和客队,虽然有时两队可以是中立的 我的问题是,我是否应该在Games表中使用2个外键(home\u team\u id,away\u team\u id)来表示这种数据关系,或者我是否应该使用Games\u team表的多对多关系来链接这两个表,在这种情况下,我还需要存储该队是主队还是客队,这似乎有点过头了 为了增加混淆,我在KohanaPHP中使用了ORM LIB,它们希望fk被称为team_

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

就这一问题而言,我们讨论的是足球队和比赛

每场比赛有2支球队,通常是主队和客队,虽然有时两队可以是中立的

我的问题是,我是否应该在Games表中使用2个外键(home\u team\u id,away\u team\u id)来表示这种数据关系,或者我是否应该使用Games\u team表的多对多关系来链接这两个表,在这种情况下,我还需要存储该队是主队还是客队,这似乎有点过头了


为了增加混淆,我在KohanaPHP中使用了ORM LIB,它们希望fk被称为team_id,或者链接表只包含2列。如果您在KohanaPHP中遇到过此问题,请留下答复,否则也非常感谢您提供的一般建议。

如果您希望能够在数据库服务器上固定“第X个标准格式”徽章,则可能应将其视为多对多,否则,我认为,每次需要输出有用数据时,只需连接一个表,就可以减少查询开销。

只需使用这两列,否则只需在joiner表中对其进行限定。这并不是说这是一个沉睡的定时炸弹,突然有一天你会发现你需要一个真正的多对多。

2栏在我看来是非常合适的。任何游戏只能有两个团队,这一事实通过两列反映在数据库模式中。通过引入一个链接表,您可以引入一场比赛可能有2个主队,2个客队,并且您需要额外的验证以确保这种情况永远不会发生。通过将内容隔离到两列,您的模式从本质上加强了数据完整性。

在规范化方面:是。只有一对多或多对多被分解成一对多关系

但现实地说,如果我要拯救性别之类的东西。我真的需要一个多州和一个日期戳附在这吗

令人惊讶的答案是肯定的——但只有当我出于商业原因需要跟踪性别变化时——对于大多数实际目的,答案是否定的


我会保留一张带有两个键的表,除非有商业理由这样跟踪它。

根据您对它的抽象方式,我会说足球比赛必须有两个队,在这种情况下,在游戏表中设置列不仅更方便,而且更正确


我甚至可以想象团队id是游戏主键的自然组成部分。

我完全认为你不应该为这个设置单独的表格。程序员更容易,数据库也更容易。考虑“如果”很好,但听起来你已经有了。不要误以为正常化总是解决一切问题的方法

我尊重对方的回答,认为使用这两列是最好的选择,但是,您提到您正在使用Kohana中的ORM库。通过在games表中使用两列,您将失去多对多关系的ORM功能。如果您设置了games_Team pivot表,则可以执行以下操作:

$game = ORM::factory('game', 1); // 1 is the game id
然后,您可以在该游戏的各个团队中循环:

foreach ($game->teams as $team) {
// do stuff with $team
}

如果你不想在这方面走得太远(在中立的地方玩游戏等等),我会说,保持简单。我曾经做过类似的事情,只是在游戏桌上放了两个外键。但是,我不能帮你的是KohanaPHP的东西,这就是为什么我不把它作为一个答案;)谢谢大家的想法,似乎每个人都同意使用2FK。指向Malphas,因为他是第一个回答的人,而且没有很多(像我一样):)只要确保在你这样做的时候评论WTF,下一个程序员不会出现,并且想知道这种关系是如何运作的。威尔是对的。它更快,而且这个特定的要求不会很快改变。我不同意。两张桌子的设计至少是BCNF,在这种情况下,再往前走是没有用的。比Will提前12秒,也是正确的。去规范化可以是你的朋友,这是错误的。如果您指定这两列是唯一的。对不起,我可能有点不清楚。我想说的是,链接表方法允许2支主队(或任何数量的主队)的可能性,因此需要围绕它进行验证。您是对的,使用两列方法可以使列变得唯一。