Ruby on rails 复杂嵌套RoR预订系统的性能问题

Ruby on rails 复杂嵌套RoR预订系统的性能问题,ruby-on-rails,database-design,Ruby On Rails,Database Design,我正在为我们的小型旅行社设计一个RubyonRails预订系统。它需要容纳许多东西,并且表结构变得相当复杂 以前有没有人遇到过类似的问题?我可能会遇到什么样的问题?性能/验证是否可能成为问题 简单地说,我有一个客户表和一个预订表。当客户联系我们询问时,将设置预订,并添加相关信息(例如,已付款/已开票、所需交通、所需酒店等) 到目前为止还不错,但这正是它变得复杂的地方。在每次预订中,客户可以预订不同的套餐(例如一日游、长途旅行、培训课程)。这些都是非常不同的,需要特定的信息,并且数量有限,因此我觉

我正在为我们的小型旅行社设计一个RubyonRails预订系统。它需要容纳许多东西,并且表结构变得相当复杂

以前有没有人遇到过类似的问题?我可能会遇到什么样的问题?性能/验证是否可能成为问题

简单地说,我有一个客户表和一个预订表。当客户联系我们询问时,将设置预订,并添加相关信息(例如,已付款/已开票、所需交通、所需酒店等)

到目前为止还不错,但这正是它变得复杂的地方。在每次预订中,客户可以预订不同的套餐(例如一日游、长途旅行、培训课程)。这些都是非常不同的,需要特定的信息,并且数量有限,因此我觉得它们应该有不同的模型

此外,一个客户可能有几个人参加他的聚会。这将导致customer表和reservation表之间的链接,以及customer表和package表之间的链接

因此,如果客户A为客户A、B和C预订一个长途旅行,并为客户B预订一个培训课程,则看起来是这样的

CUSTOMERS TABLE
CustomerA
CustomerB
CustomerC
CustomerD
CustomerE
etc

RESERVATIONS TABLE
1. CustomerA

LONG TRIP BOOKINGS
CustomerA - Reservation_ID 1
CustomerB - Reservation_ID 1
CustomerC - Reservation_ID 1

TRAINING COURSE BOOKINGS
CustomerB - Reservation_ID 1
这是一个非常简化的示例,省略了一些细节。例如,将有一个包含培训课程细节的模型,一个包含长途旅行细节的模型,一个包含长途旅行时间表的模型,等等。但是这个细节不应该影响我的问题

我想知道的是:

1) 在将customer表链接到reservations模型以及嵌套在reservations下的bookings模型时,我应该注意哪些问题

2) 如果我需要处理有关预订本身(包括发票)以及特定套餐预订的信息,这是最好的方法吗

一方面,这种方法似乎很复杂,但另一方面,将所有内容简化为单个包模型似乎并不能提供足够的灵活性

请让我知道,如果我没有解释清楚这个问题,我很乐意提供更多的信息。非常感谢您提出的任何想法、建议或意见,这些想法、建议或意见将帮助我思考这个相当复杂的数据库设计


非常感谢

我为旅行社和批发商建立了一个大型预订系统,我可以告诉你这并不容易。预订的产品种类似乎有相似之处,但仍有很大差异。此外,日期敏感性与其他系统有很大区别

1) 关于“客户”,我通常使用不同的模型来表示不同的概念。你真的有:

  • a。支付预订费用的个人/公司
  • b。紧急情况联系人
  • c。旅行的人
a&b看起来是一样的,但是如果你有代理预订,那么你可能想把他们分开

我通常使用一个=>'customer'表,然后对b使用一些简单的联系人字段,最后对c使用一个'Passentials'表。这些可以设置为同一模型的不同关联,但我认为它们已经足够不同了,我倾向于将它们分开——也许使用一个公共地址/联系人模型

2) 我认为这很好,但取决于你的需要。如果您正在为旅客建立行程,那么在“预订”中设置“旅客”是有意义的,然后针对个别行程项目,设置旅客使用该项目旅行的链接

这更为复杂,您必须小心跟踪相关性,但另一种方法是不跟踪乘客姓名,只需为每个项目分配数量(1xAdult,2xChildren)。后一种方法适用于小型预订,因此它似乎取决于您的预订是简单的,还是通常由较长的行程组成

其他)此外,对于不同产品类型的不同型号,这可以很好地工作。然而,往往会有很多交叉,因此某种常见的“资源”模型可能更好——或者其他一些捕获常见行为的方法

如果我还没有回答您的问题,请确实询问更具体的数据库设计问题,或者我可以添加更多关于我发现效果良好的具体示例的详细信息


祝你设计顺利

如果您像上面描述的那样实现这一点,那么最具挑战性的部分将是您需要设置的组合键,以便将预订与客户和预订绑定在一起,rails本机不支持这一点。也就是说,有一个复合密钥gem可以解决这个问题:。从性能的角度来看,您所描述的一切都没有引起注意。嗨@MarcTalbot,谢谢您的建议。我本来打算使用联接表来处理此客户预订关系。可能是多态的,以适应不同的预订类型。我不知道;我不太了解复合键,我想听听你对这两种方法的相对优点的看法。ThanksA带有关联模型的联接表可用于存储关联的其他属性。每个客户每次预订的计算价格。我认为您最好采用复合键方法,因为这将消除最终会反映在代码中的连接。谢谢@adzdavies,一些有用的提示。我已经详细考虑了关于客户的这个问题。从设计的角度来看,将这些作为单独的模型处理要简单得多。然而,拥有一份中央联系人名单也非常有用。我还在为产品类型争论不休。我想知道单表继承是否允许我覆盖共性,同时仍然允许我容纳差异。我对STI不太熟悉,所以需要重新学习