一对多对多

时间:2017-02-06 16:18:40

标签: database database-design filemaker

我有一个像这样的桌子的足球联赛项目......

--------------------------------------

LEAGUES TABLE
联盟KEY
联赛名称赛季

团队表
团队KEY
联盟KEY
团队名称

球员表
球员KEY
球队KEY(s)
球员姓名

--------------------------------------

每支球队都可以在一个联赛中。每个球员都可以分配到每个联赛中的一个球队。 (这是通过Teams Key(s)复合索引字段完成的。)

所以,一名球员可以在3个不同的联赛中的3支球队。这一切都很有效。

我的设计是让每位玩家获得不同的球衣号码,具体取决于您正在观看的球队。

如何设置这样的一对多对多参考?

2 个答案:

答案 0 :(得分:3)

您的标题有点误导,因为您拥有

cqlsh> insert into ks.cf (key,val) values (1,1);
cqlsh> select * from system.hints; 
 target_id                            | hint_id                              | message_version | mutation
--------------------------------------+--------------------------------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1ca6779d-fb41-4a26-8fa8-89c6b51d0bfa | e80a6230-ec8c-11e6-a1fd-d743d945c76e |               8 | 0x0004000000010000000101cfb4fba0ec8c11e6a1fdd743d945c76e7fffffff80000000000000000000000000000002000300000000000547df7ba68692000000000006000376616c0000000547df7ba686920000000400000001
(1 rows)

cqlsh> insert into ks.cf (key,val) values (1,1); cqlsh> select * from system.hints; target_id | hint_id | message_version | mutation --------------------------------------+--------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1ca6779d-fb41-4a26-8fa8-89c6b51d0bfa | e80a6230-ec8c-11e6-a1fd-d743d945c76e | 8 | 0x0004000000010000000101cfb4fba0ec8c11e6a1fdd743d945c76e7fffffff80000000000000000000000000000002000300000000000547df7ba68692000000000006000376616c0000000547df7ba686920000000400000001 (1 rows) 之间的 多对多 关系:一个团队有很多球员,一个球员可以在很多球队。

确实,FileMaker允许您使用多键字段实现多对多关系。然而,这是一个有一些限制的黑客 - 其中包括无法将任何属性分配给团队到玩家的个人加入,例如所需的球衣号码。

解决多对多关系的正确方法是通过连接表,如下所示:

{
  "_id": {"_type": "ObjectId", "_value": "58638a8d6a0b12b41ceec1dd"},
  "lastUpdated": {"_type": "ISODate", "_value": "2016-12-28T12:13:12.069Z"},
  "createdAt": {"_type": "ISODate", "_value": "2016-12-28T09:49:00.985Z"}
}

Teams表将包含(至少)字段:

  • TeamID(链接到团队)
  • PlayerID(链接到玩家)
  • JerseyNumber

并且Players表格中没有Teams --< TeamPlayers >-- Players 字段。

答案 1 :(得分:-1)

许多对多

Answer by michael.hor257k是正确的。您与团队和人员之间存在Many-To-Many关系。

关系数据库

你已经超越了Filemaker的能力。 Filemaker是一个很棒的产品,但它不是一个成熟的关系数据库。我建议考虑(a)4D或(b)具有前端的SQL引擎,如XojoVaadin

桥牌表

关系数据库设计中的多对多关系始终通过添加第三个表(桥接表)来解决。桥表始终有一对外键,链接到多对多表中的每一个。

多对多的常见例子是书籍和作者,其中一本书可以有一个或多个作者,每个作者可以写一本或多本书。必须添加第三个表“作者身份”。 “作者身份”中的每一行都带有一本书的关键词和一位作者的关键词。如果一本书有两位共同作者,你会在“作者身份”中找到两行,其中包含该书的关键价值。如果作者在她的职业生涯中写过七本书,那么“作者身份”表将有七行带有该作者的关键价值。

建议架构

仅限当前信息的表格设计如下所示。

enter image description here

person_表代表每个人。 player_表表示该人员在团队中的成员资格。如果Susan在三支球队比赛,她有三条player_条记录,每条记录都链接到她的三支球队之一。她可以在每个团队中拥有不同的球衣号码,因此jersey_number_列属于player_表。如果此上下文中的player_是一个导致您混淆的术语,请对此表桥接member_membership_使用team_person_等。

的问题:

  • 此结构不强制规定她每个联盟只能在一个团队中。
  • 此结构仅适用于当前成员资格。
    • 您没有解释Season上提到的League的业务规则和含义。
    • 这里没有代表历史。如果您想跟踪一段时间内的变化,例如Susan加入特定团队以及退出该团队时,需要添加更多内容。