首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据模型中是使用has_many还是has_many :直通

在数据模型中是使用has_many还是has_many :直通
EN

Stack Overflow用户
提问于 2013-08-07 09:43:54
回答 3查看 89关注 0票数 0

我正在使用Ruby on Rails构建一个web应用程序,我的数据模型有用户,每个用户都可以创建按键(音乐键,例如A#小调)。

键由和弦组成,和弦由音符组成。音符的数量是有限的,但和弦和基调的数量是无限的(因为每个用户都可以创建自己的和弦和基调,允许重复)。

我目前的工作是假设音调、和弦和音符都是数据库中的一个表(如果这听起来不对劲,请停止我),我正在尝试决定是否每一个都应该belong_to高于它的级别。

我希望能够选择一个键并看到其中的所有和弦,并选择一个和弦并看到它所在的所有键(和弦/音符也是如此)。此外,我希望能够看到用户,键,和弦和音符的列表(索引),彼此独立。这是否有助于使用belongs_to :通过关联?

如果还不清楚,我是一个RoR初学者,所以任何指导/建议都将不胜感激。提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-08-07 10:09:47

当存在一对多关系时使用has_many关系,当存在多对多关系时使用has_many :through。例如,在你的描述中,你说和弦是由许多音符组成的,所以chord has_many音符。一个音符是只有一个和弦还是have_many和弦?如果音符只有一个和弦,则适合使用has_many/belongs_to关系。

我刚刚在维基百科上搜索,发现C大调和弦由音符C,E和G组成。如果和弦has_many音符和音符belongs_to和弦,那么chord_id将存储在音符表中,音符不能have_many和弦。我假设音符has_many是和弦的,所以many_to_many关系可能更合适。

我创建了一个关于many_to_many关系的code quiz,您可能会发现它很有帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-11-03 06:56:15

对于前面的回答,我没有什么可补充的,Ruby wise。这更像是对你的问题的音乐理论评论,而不是对编程问题的回答。我在你的道路上学到了一些东西,可能会影响你的设计选择。对于如何将一组音符与键联系起来,没有好的答案,因为一系列音符的和弦含义是模棱两可的。相同的音符序列可以有不同的弦乐名称(和含义),这取决于作曲家如何使用或打算使用它。和弦越复杂,问题就越严重。你可以很容易地从基调到和弦再到音符,但没有保证在不听取作曲家的意见的情况下倒退。问题来自于基本的音乐二分法,其中音符既可以根据它们的和声关系(恰到好处的五分之一,比例为3:2 )来定义,也可以根据它们在调和音阶中的位置来定义。(在钢琴上演奏的完美五度音符是700美分,比例约为1.498。)调和音阶是一种必要的折衷,但当您使用它来表示乐曲时,重要的音乐理论信息就会丢失。对于调和音阶中的所有音乐音程,可以有许多类似的完美调音音程。例如,由以下比率定义的音程: 3:2、40:27和243:160都足够接近,以至于它们可以转换为相同的调和音符,但要知道和弦是什么,你需要知道哪个比率是预期的。因为调和的音符是一个近似值,一旦你选择了一个实际的音符,你从音符转到和弦所需的比率信息就会丢失。它的比率在作曲意义上定义和弦。

这并不意味着这是一项不可能完成的任务,至少对于较简单的和弦是这样。对于三和弦,通常只有一个有用的选择,即使是倒置,但一旦你添加了第七个,它就会变得混乱。你必须做出选择。将会有一个最可能的选择,这可能是足够好的。我决定选择最和声的和弦(大约是音程比率中整数最小的和弦)。这意味着你不能百分百地从组成和弦的音符中推断出与之相关的和弦名称。对于一般的爵士乐曲来说(爵士喜欢复杂的和弦),这几乎成了一个无望的例子。

如果你只是使用这些数据在经过调谐的乐器上进行演奏,这可能没有什么不同。在调和的音阶中,所有这些和弦听起来都是一样的。如果你试图给无伴奏合唱调音(人类的声音是无限可调的,并且趋于完美),或者试图理解作曲家的音乐意图,你就会遇到麻烦。

票数 1
EN

Stack Overflow用户

发布于 2013-08-07 11:18:12

接受答案提出了我的能力。我不同意在您的应用程序中使用many-to-many关系。它的数据库设计方法就是这么做的。我相信,如果你有某种类型的many-to-many关系,你会想要有一个解析表,存储组合键chord_idnote_id,这个表打破了多对多关系,并解决了这种形式的基数,你可能会在这里进行。因此,您可以通过 ChordNote有效地拥有Chord has_many notes ,然后在您的备注表格中,您将拥有一个Chord has_many Chord So ChordNote。您会注意到关键字through,下面的链接确切地解释了这种关系设置对Has-Many-Through的作用。我站在正确的立场上辩护,有模型关联和弦,has_many注释,和弦,因为这个问题为我的推理Why No Many To Many Relationships辩护。我只是不明白为什么你要用多对多的关联来设置你的应用程序。

所以说,你的设置是(如果你有多对多的话)

Chord

代码语言:javascript
复制
class Chord < ActiveRecord::Base 
   Chord has_many :notes, :through ChordNote
end

ChordNote

代码语言:javascript
复制
class ChordNote < ActiveRecord::Base 
  belongs_to :chords
  belongs_to :notes
end

便笺

代码语言:javascript
复制
class Note < ActiveRecord::Base
  has_many :chords, :through => :ChordNote
end 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18093308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档