Ruby on rails Rails-我应该使用布尔字段还是关系表?
用户模型有三个键:Ruby on rails Rails-我应该使用布尔字段还是关系表?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,用户模型有三个键:is_master,is_standard,is_guest,因为我最初想使用的布尔方法是is_master?或者是电源 但是,如果创建用户类型关系并创建我自己的方法(如下所示)更好: def master? return true if self.user_type = 1 end 如果主/标准/来宾关系是互斥的(也就是说,您只能是其中的一个),那么存储类型的字段(请以人类可读的形式,不要使用不透明的数字)更好。您总是可以简单地重新实现is\u foo? 另一方面,如
is_master
,is_standard
,is_guest
,因为我最初想使用的布尔方法是is_master
?或者是电源
但是,如果创建用户类型关系并创建我自己的方法(如下所示)更好:
def master?
return true if self.user_type = 1
end
如果主/标准/来宾关系是互斥的(也就是说,您只能是其中的一个),那么存储类型的字段(请以人类可读的形式,不要使用不透明的数字)更好。您总是可以简单地重新实现
is\u foo?
另一方面,如果您的帐户可以同时是master/standard/guest/whatever中的多个,那么请使用单独的布尔字段。如果master/standard/guest关系是互斥的(即,您只能是其中的一个),则使用存储类型的字段(请以人类可读的形式——不要使用不透明的数字)更好。您可以随时重新实现
is\u foo?
另一方面,如果您可以同时拥有一个master/standard/guest/以上的帐户,那么请坚持使用单独的布尔字段。作为DBA,当人们使用列作为标志时,我总是讨厌,这将是大量额外的列。 如果是相同的类型(比如账户类型),我会按照第一个答案的建议去做(包括使用文本,而不是数字) 另一方面,如果您需要单独的标志或多个类型(但有一个限制的数字),我实际上会选择二进制计算 也就是说,在表中有一列表示所有标志,然后为每个标志分配一个数字 前
设置值时需要做更多的工作,但不会因为很多列只用于标志而使表变得杂乱无章。作为DBA,当人们使用列作为标志时,我总是不喜欢,这会有很多额外的列。 如果是相同的类型(比如账户类型),我会按照第一个答案的建议去做(包括使用文本,而不是数字) 另一方面,如果您需要单独的标志或多个类型(但有一个限制的数字),我实际上会选择二进制计算 也就是说,在表中有一列表示所有标志,然后为每个标志分配一个数字 前
设置值时需要做更多的工作,但不会因为很多列只用于标志而使表变得杂乱无章。如果您看看restful身份验证插件是如何做到这一点的(其中包括用户角色),它们会使用联接表 我认为联接更具可读性。使用联接可以使您的角色系统更灵活
如果您要求一个用户只能有一个角色,我会将该逻辑放在您的模型中。如果您看看restful身份验证插件是如何做到这一点的(其中包括用户角色),他们会使用连接表 我认为联接更具可读性。使用联接可以使您的角色系统更灵活
如果您要求用户只能拥有一个角色,我会将该逻辑放在您的模型中。我会从解决您当前需要的最简单的事情开始。根据需要重构并增加复杂性。听起来一组布尔列正是您需要的。我会从解决您当前需要的最简单的事情开始。重构并根据需要增加复杂性。听起来一组布尔列正是您所需要的。对不起,我无能为力,但您编写的代码需要重构。>>def master?>>>>1==self.user\u type>>end与您所编写的相同,但效率很高。(啊!没有办法在SO中格式化注释内的代码。代码中的'>'表示缩进。)仅供参考:Do self.user_type==1。这将返回一个布尔值,这样您就不必通过if测试手动返回布尔值。对不起,我无法帮助您,但您编写的代码需要重构。>>def master?>>>>>1==self.user_type>>end与您编写的相同,但效率很高。(啊!没有办法在SO中格式化注释内的代码。代码中的'>'表示缩进。)仅供参考:Do self.user_type==1。这将返回一个布尔值,因此您不必通过if测试手动返回布尔值。由于您使用的是Rails,我假设您可能使用的是MySQL。据我所知,MySQL不支持位图索引。因此,如果您希望查找具有给定标志的所有用户,则可以从以下用户执行类似SELECT*的查询:RE(flags&1=1),它将不使用索引并执行完整的表扫描。由于您使用的是Rails,我假设您可能使用的是MySQL。据我所知,MySQL不支持位图索引。因此,如果您希望查找具有给定标志的所有用户,则可以从(flags&1=1)的用户中执行类似SELECT*的查询它将不使用索引并执行完整表扫描。
FLAGS = {:master => 1, :standard => 2, :guest => 4, :power => 8,
:another_flag => 32, :yet_another_flag => 64}
def is_master?
self.flags & FLAGS[:master]
end
def is_standard?
self.flags & FLAGS[:standard]
end