MYSQL数据库设计是否序列化

时间:2011-07-21 10:00:02

标签: php mysql serialization

我们有一个在php和mysql上运行的现有应用程序。我们正在添加细粒度的用户授权,以便某些用户只能访问某些资源。有几千个用户和大约100个资源(虽然预计两者都会增长)。

我的数据库设计类似于:

用户: id,姓名,电子邮件

资源: id,资源

选项1 因此,如果我们在考虑典型数据库规范化的情况下接近这一点,我们也会有下表。我想我们会遵循用户被拒绝权限的结构,除非user_resources表中有记录。如果随后为特定资源删除了他们的权限,那么我们只需从user_resources表中删除该行。

* USER_RESOURCES:* user_id,resources_id

选项2 另一种方法是忘记user_resources表,只在users表中创建一个新列(称为权限或类似),并在users表中存储该用户权限的序列化值。每次我们需要检查用户的权限时,我们都必须反序列化该值。

哪种方法被认为是更好的做法,并且是否有任何重要的专业人士或者有任何一种方法?

4 个答案:

答案 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。