如何在数据库中允许和存储子选项

时间:2012-06-22 20:04:26

标签: php mysql storage options

我正在为聚会场所制作在线预订系统,而我的客户希望为他的用户提供某些“套餐”。这些包将有“子选项”,我不确定如何存储这些。例如,如果一个包是“气球”,我需要能够在其下存储不同的选项,例如“红色气球”,“绿色气球”等,或者比萨>大,中小。

我正在使用数据库,当然,它目前已设置了包的表和预订表。预订表有一列,其中包含引用存储在“packages”表中的记录的包ID列表。

现在,我认为最好的方法是在约会表中添加另一列,其中包含子选项,格式为:

packageid:optionid;package2id:option2id

以及包表中具有以下形式选项的另一列:

1:red,2:blue,3:green //for options with no add'l price
1:large[$20],2:medium[$15],3:small[$10] //for options that change the price

我想这可行,但我觉得必须有更好的方法来做到这一点。如果有人有任何想法,或者以前做过这样的事情,我会很感激帮助。

4 个答案:

答案 0 :(得分:7)

如果您有可选数量的选项,则通常会执行以下操作:

创建一个按ID链接包和选项的表。所以你有packagesoptions表,然后你会有一个package_options表,只有(超出它的id和你存储的任何创建/ mod日期时间)a {{ 1}}和package_id

然后你会加入这三个表来获得包的选项。我并不特别喜欢这种方法,但我还没有在关系数据库领域找到更好的方法。

答案 1 :(得分:1)

有几种方法可以解决这个问题。基本上,您的解决方案越灵活,它就越复杂。既然你正在寻求帮助,我会给你一个更简单的解决方案。

制作一个这样的表:

ID, PackageName, OptionName
1,  Balloons, Red Balloons
2,  Balloons, Blue Balloons
3,  Pizza, Plain
4,  Pizza, Pepperoni
5,  Clown, NULL

然后,当您需要可供选择的包列表时,可以从tblPackages GROUP BY PackageName中选择PackageName。用户选择包后,您可以从TblPackges中选择SELECTName,其中PackageName = 1;

通过这种方式,用户实际上无法选择单个包,他们实际上是在选择选项,但对他们来说,看起来他们选择了一个包,然后选择了一个选项。

如果你熟悉这个概念,你会发现你可以制作一个包表,然后是一个选项表,并在它们之间加入。但老实说,对于一个小型应用程序,没有性能原因这样做。上面的方法比使用大量连接的ID的混乱更容易理解。

希望它有所帮助。

答案 2 :(得分:1)

首先列出要存储的实体以及它们之间的关系。根据您的描述,您有3个实体参与存储约会:

  1. 约会
  2. 选定的套餐
  3. 选择的选项
  4. 有两种关系:

    1. 每个约会可以包含任意数量的包
    2. 每个包装任意数量的选项
    3. 实体是您的主表,它们之间的关系是外键:

      • 表约会(Id Int,约会详情......)
      • 表selected_pa​​ckages(Id Int,appointment_id Int,包详细信息......)
      • 表selected_options(selected_pa​​ckage_id Int,选项详情......)

      请注意,我已经在这里仔细地提到选定的包和选项 - 您可能还有其他表格代表可用包和选项,以及我写的地方“包详细信息”和“选项详细信息”,您可以只存储一个外键引用(尽管您可能需要拍摄快照,特别是价格等重要细节,以便您记录详细信息 在预订时。)

答案 3 :(得分:-1)

您没有说明您使用的是哪种类型的数据库(除了在说明中提及表格)。

因此,如果我们假设您只是希望根据最佳做法得到答案,我建议您使用schema-free(NoSQL)MongoDB而不是关系数据库。

否则只是忽略我的评论并阅读其他评论。我想你需要两个由SQL join相互连接的独立表。