我们有一个在php和mysql上运行的现有应用程序。我们正在添加细粒度的用户授权,以便某些用户只能访问某些资源。有几千个用户和大约100个资源(虽然预计两者都会增长)。
我的数据库设计类似于:
用户: id,姓名,电子邮件
资源: id,资源
选项1 因此,如果我们在考虑典型数据库规范化的情况下接近这一点,我们也会有下表。我想我们会遵循用户被拒绝权限的结构,除非user_resources表中有记录。如果随后为特定资源删除了他们的权限,那么我们只需从user_resources表中删除该行。
* USER_RESOURCES:* user_id,resources_id
选项2 另一种方法是忘记user_resources表,只在users表中创建一个新列(称为权限或类似),并在users表中存储该用户权限的序列化值。每次我们需要检查用户的权限时,我们都必须反序列化该值。
哪种方法被认为是更好的做法,并且是否有任何重要的专业人士或者有任何一种方法?
答案 0 :(得分:2)
选项2是在数据库中创建数据库。那可能不是你想要做的。你可能会遇到might not expect at first的问题。
这两个选项都有利有弊,这是您实际想要使用数据库的问题。通常情况下,选项2被认为是不好的做法,因为它会降低数据库的使用率并使数据存储的可访问性降低。
另见Serialized data in mysql database needs to combined in an array。
答案 1 :(得分:2)
选项1是要走的路,除非你有坚实的论据。将列添加到users表适用于基于角色的权限。您可以混合使用这两个选项,如果您基于角色的权限但允许分配不同的权限 - 那么只在表中写入例外。
答案 2 :(得分:1)
在这种情况下,最好使用选项1,因为:
使用选项2,您正在对数据进行非规范化。很难在这个数据上写一个查询。任何时候你想要使用它,你必须首先反序列化它。
当数据很大并且已发布时,序列化和存储是一个不错的选择,因为您将来不会更改它,并且可能仅需要审计目的。例如:包含序列化产品详细信息的订单。
您的数据和相关元素太小,甚至无法考虑选项2
答案 3 :(得分:0)
我会选择登录用户身份验证的选项2,但你必须检查你的需求,因为如果你的网站或应用程序查询一次并在某种[userdata]对象中注册它,那么这是一个问题或设计不要使用option2。