最佳实践:放置mysql字段的位置

时间:2017-01-31 16:09:53

标签: php mysql

在用户结算订阅信息的表格中,需要一个字段来说明结算频率。目前唯一的选择是每月或每年。

在这种情况下,最佳做法是什么?将实际值保留在订阅表的字段中或创建订阅频率表,每年为1,每月为2,并将ID插入订阅表中?

3 个答案:

答案 0 :(得分:1)

结算频率只是订阅的一个属性。并且每个订阅只有一个这样的属性。因此,在我看来,不需要额外的表格和加入。

当然,您可以添加一个额外的表格,其中包含可能的结算频率。与1: annually2: monthly3: weekly或其他类似。并使用id作为订阅表的billing-frequency-field中的值。

或者,您可以在该字段中存储每年的结算流程数量,并在您的应用程序中进行“命名”。 (1 =每年,12 =每月,52 =每周等等)。

答案 1 :(得分:1)

根据规定,没有其他信息......

我个人的偏好是只存储订阅频率"实体表中的属性。

无需创建单独的表格。 (我没有看到"订阅频率"作为系统中的一个实体,我已经有足够的复杂性,参考完整性和外键用于我真正需要它的东西。)

我不会对我的桌子进行任何查询,要求加入"查找"表返回一个字符串值,超出id。这似乎没必要。

就个人而言,我考虑添加如下列:

 subscription_frequency  ENUM('','monthly','annually')

如果我需要在列表中添加其他值:

ALTER TABLE mytable 
  MODIFY subscription_frequency  ENUM('','monthly','annually','quarterly')

这里的ENUM示例只需要一个字节的存储空间。并且带有ENUM的INSERT / UPDATE / SELECT语句就好像它是一个VARCHAR一样,并且在枚举列表中没有INSERT / UPDATE字符串值的一些功能。

如果有理由避免使用ENUM,那么我只会存储VARCHAR。

如果我需要额外的查找表,我不会使用代理ID作为主键。我会使用字符串值'每月','每年'作为主键和外键列。 (我想避免要求JOIN从id返回一个字符串。)如果对列表中的值有一个顺序,我会添加一个序列列来对它们进行排序。 / p>

答案 2 :(得分:0)

这取决于偏好和扩展能力。我个人会创建另一个名为SubscriptionFrequency的表,其中包含属性id,description,billingFrequency,createDate,lastModifiedBy,etc...或类似的东西。您存储在UserBillingSubscriptionInfo中的值可能是此新表的主键的外键。如果你做了另一个选项(只是暗示1 =年度和2 =每月),我会在架构或文档中添加描述,以了解该关系的工作原理。

相关问题