-1

我正在为我的音乐协会创建一个网站,用户应该可以看到一些 PDF。现在,大约有 200 个用户,分为 10 个组(其中一个用户可以在多个组中),以及 30 个仪器。对于所有乐曲,数据库应该知道哪个组中的哪个乐曲属于哪个用户和乐器。

例如,当我使用我的用户名“Jeroen”登录时,数据库应该知道对于“Group1”组中的“MusicalPiece1”,我需要“Instrument1”和“Part1”的 pdf。

请注意,在不同的乐曲上,我可能会演奏其他乐器,因此“Instrument1”和“Part1”可以改变。另请注意,在“Group1”中,我可能会为“MusicalPiece1”播放“Instrument1”“Part1”,但在“Group2”中,我可能会为相同的“MusicalPiece1”播放“Instrument2”“Part2”。最后,应该可以更改数据。(不是太难,但是对于复杂的数据存储可能会非常困难......)

因此,我需要一种有效的方法来通过 PHP 将这些数据存储在 MySQL 数据库中,因为我不想在脚本计算我应该得到的 PDF 之前等待几分钟。

编辑:想法是脚本的输入值是:

Username
Group
Musical piece

现在输出(结果)应该是:

Instrument
Part

这意味着每个组合都会给出特定的乐器和部分。

4

1 回答 1

3

这是一个数据库设计问题。这是您的实体(表格)和几列:

  • 成员名字)
  • 团队名字)
  • 件(名称)
  • 仪器(名称)

由于一个成员可以属于许多组,因此您还需要另一个表,它在这两个表之间形成一个多:多。

  • 团体会员

此外,乐器似乎是由 Piece 与您的 Group 的交集决定的。因此,GroupMember 表决定了您的工具:

  • GroupMember (id_member, id_group, id_piece, id_instrument, id_part)

因此,对于一个 Piece,您可以列出许多 GroupMembers,其中确定了乐器。这允许您规定成为多个组的成员允许您在每个组中演奏不同的乐器。另请注意,乐器是在 GroupMember 中设置的,它允许该组的不同成员演奏不同的乐器。

最后,我认为 GroupMember 的主键为 (id_member, id_group, id_piece),防止成员在每个 Piece 中多次加入 Group(无论他们是否拥有相同或不同的 Instrument,也不管他们在哪个部分)。

您现在应该发现,如果这些关系正确地为您的场景建模,您可以使用 SQL 从数据中发现任何您希望的内容。


来自评论的附录:有时这些关系问题是语义问题。例如,如果我们说一个成员不能在每个乐曲中多次加入一个组,那么我们如何处理希望合法地在一个组中使用两种乐器为同一乐曲演奏的成员?解决方案可能是将它们分成两个组,每个组具有相同的 Piece。这似乎与您问题的第三段兼容。当然,这取决于“组”在您的实际场景中的实际含义。

我要补充一点,您对性能的担忧是错误的。您可以将具有 40K 行的数据库调整为非常快的事情,通常只需添加正确的索引。但是,您优化得太早了:先让它工作,然后再研究性能问题。在我看来,你走在正确的轨道上。

于 2013-11-02T13:20:40.917 回答