【问题标题】:How to implement custom fields in database如何在数据库中实现自定义字段
【发布时间】:2018-02-12 11:43:26
【问题描述】:

我需要在我的数据库中实现一个自定义字段,以便每个用户都可以将他想要的任何字段添加到他的表单/实体中。

用户应该能够按任何自定义字段过滤或/和排序他的数据。

我想使用 MySQL,因为我的其余数据非常适合 SQL。因此,除非您有一个好主意,否则 SQL 将优于 NoSQL。

我们想了几个解决方案:

  1. JSON 字段 - 非常适合动态模式。可以过滤和排序。问题是它比普通列慢。 动态索引可以解决这个问题,但是动态添加索引风险太大。

  2. 键值表 - 一个简单的解决方案,但非常慢。您无法正确索引它,而且查询很糟糕。

  3. 静态占位符列 - 创建 N 列并将每个字段映射到其占位符。 - 在性能方面一个很好的解决方案,但它使数据库不可读并且它的列有限。

任何想法如何改进任何解决方案或任何新解决方案的想法?

【问题讨论】:

  • Postgres 允许对 JSON 字段进行索引;但是,我们不应该提出软件推荐,所以这只是一个观察。
  • MySQL 也是如此,但您是否建议动态添加索引?据我了解,添加索引是一个非常繁重的操作,它会锁定表
  • @GuySegev - 这是你要回答的问题。不建立索引的负担是什么?您说用户应该能够按这些列进行排序或过滤,这样做并不是免费的,但是通过适当的索引会更便宜。您面临的问题是SQL 中的SStructured,这适用于数据和语言。适用于某些行而不适用于其他行的动态列的想法是对 unstructuredpartially structured 数据的描述。
  • 另一种选择是EAV 表; Entity (您要添加数据的实际行的键)Attribute (您要添加的列/属性/字段/数据的“名称”到那一行)Value(你要添加的那个,嗯,值)。您无需添加列,而是添加行。但它们在用于过滤或排序时也很慢。我怀疑没有好的答案,只有least worst,这在很大程度上取决于您的数据、用例、应用程序等。
  • @GuySegev - 已经很清楚了。我的 cmets 不是对您的问题的批评,它们是关于 SQL 是否适合您的用例的(或不是) 的观察。你可以让它发挥作用,但你需要做出权衡。这些权衡与您可能拥有多少不同的列有关(即,1000 个用户每个有 5 个定制列,每个用户有 5 个定制列与 5 个管理员用户创建 5 个由 1000 个其他用户共享的列)。它们与每个用户拥有多少数据有关(即,如果用户只查询自己的 100 行数据,你真的需要索引吗?)。等等。

标签: mysql sql json database


【解决方案1】:

正如许多评论者所说,这个问题没有简单的答案。根据您愿意做出的权衡,我认为 JSON 解决方案是最简洁的 - 它是 MySQL 的“原生”,因此最容易解释和理解。

但是,鉴于您写的是仅在设置时指定列,技术熟练的人当然可以让设置过程包含“更改表”语句以添加新列。您的数据库访问代码和所有相关的视图逻辑也需要可配置;这绝对不是微不足道的。

但是...这是一个行之有效的解决方案。例如,Magento 和 Drupal 具有用于向业务实体添加属性的管理屏幕,这反过来又向关系数据库添加列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多