在用户结算订阅信息的表格中,需要一个字段来说明结算频率。目前唯一的选择是每月或每年。
在这种情况下,最佳做法是什么?将实际值保留在订阅表的字段中或创建订阅频率表,每年为1,每月为2,并将ID插入订阅表中?
答案 0 :(得分:1)
结算频率只是订阅的一个属性。并且每个订阅只有一个这样的属性。因此,在我看来,不需要额外的表格和加入。
当然,您可以添加一个额外的表格,其中包含可能的结算频率。与1: annually
,2: monthly
,3: 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 =每月),我会在架构或文档中添加描述,以了解该关系的工作原理。