【问题标题】:Parent child structure or serialised array in MySQL database?MySQL数据库中的父子结构或序列化数组?
【发布时间】:2015-09-03 12:11:00
【问题描述】:

我正在努力就如何构建我的 MySQL 数据库做出正确的决定。

我可以通过例子来最好地解释这一点:

我有一张名为customers 的表。一个客户可以控制一个或多个sitesSites 有自己的桌子。 表customerssites 有一个主键id (AUTO-INCREMENT)。 大多数客户可以修改多个“站点”,我们正在向 100.000 个客户发展。我需要对这些信息做的就是检查客户是否可以编辑网站。

问题是:如果我想将查询保持在最低限度并保持最佳性能,如何才能最好地存储我的数据? 1. 我创建了一个客户可以编辑的所有“站点”的序列化数组,并将其放在customers 表的列中。 2. 我为customers 创建了一个名为customer-site 的子表,我在其中写入了客户可以访问的所有site_id。

正如您可能读到的那样,我知识不多,所以非常感谢任何信息!

最好的问候, 阿巴约布

【问题讨论】:

  • 数组是一个非常糟糕的主意。寻找标准化数据 customer_site 表。每个人都将很容易理解,因为它是一个非常常见的选择,易于使用且查询速度足够快。数组没有这些优点。你甚至在 mysql 中都没有原生数组支持。除了选项 2 之外,没有其他好方法。
  • 任何带有序列化数组的东西都很难在 MySQL 中处理(它可以完成 - 但可能只值得向某人展示令人讨厌的 SQL 以说服他们不要这样做!)。以逗号分隔的站点 ID 列表稍好一些(可以使用 FIND_IN_SET 访问),但效率不高或不够灵活。将查询数量保持在最低限度和高效的选项 2 是最佳选择。

标签: php mysql structure


【解决方案1】:

您应该创建一个 permissions 表,该表将包含两列 short_namename。您应该创建另一个表,该表将包含 customer_idsite_idpermission_short_name 的网站 customer_permission_site 的客户权限。如果用户有权限,然后检查代码中的短名称字段。

您在权限表中的 short_name 字段将是该表的主键。

这种架构的好处

  1. 您可以轻松地将用户设置为网站的编辑、删除等权限。
  2. 您可以在权限表中设置授予用户访问网站的权限
  3. 标准化且易于搜索和检索。

【讨论】:

    【解决方案2】:

    Mysql 规范化规则说选项 2 是要走的路。直接在数据库中编辑也更容易。有了这个,您还可以将外键绑定到两者,并级联删除站点/客户(也删除链接表中的行)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多