0

我正在制作一个 Ruby on Rails 应用程序,并且意识到我的 User 类可能最终会带有很多通用的布尔/整数属性。例如,假设我每个季度都有一个促销活动,并且我只希望一个人能够使用该促销活动一次。然后我必须每季度创建一个新列 has_used_promotion_N 来跟踪该促销活动。

或者,我正在考虑创建一个名为“通用标志”的新列,它只是帐户上设置的标志的逗号分隔值。例如:

“has_used_promotion_1,has_used_promotion_2,limit_on_feature_a=20”等可以为某些特定用户设置

(或者也许我会将其存储为 JSON)

无论如何,我正在考虑在我的数据库中给自己一些类似 NoSQL 的功能。

出于某种原因,这真的是糟糕的设计吗?以前有没有其他人这样做过?关于 RoR,我完全想念什么吗?

4

2 回答 2

3

在我看来,Promotion 应该是一个单独的模型,与 User 具有多对多的关系。当您有促销时,您将创建一个 Promotion 实例,并且当有人使用该促销时,您将该人添加到promotion.users 关系中。

这比您的想法要好得多,因为您现在可以查询这些关系。想要使用第一季度促销的所有用户的列表?没问题。您可以使用您的解决方案来做到这一点,但是您必须求助于一些技巧(这是一个词吗?),并且您必须在每个查询中为每个用户解析通用标志字符串。至少可以说并不理想。

于 2012-05-31T01:12:41.230 回答
0

如果有任意大小的关联集合,那么它应该是一个真实的关系,使用现有的数据库和设施建模。促销听起来就是这样,而且看起来你已经在你的数据库中建模了;没有真正的理由保留重复的值层次结构。

对于实际通用标志,您可以拥有一个命名标志表并再次使用真实关联。

could也只需将标志对象序列化为文本列。但是,这样做会妨碍您对标志/标志值进行琐碎的搜索。这对于与单个用户相关联的一堆标志可能无关紧要,除非他们已登录,否则您不关心这些标志,但要小心行事——这取决于您的用例。

于 2012-05-31T01:53:10.727 回答