gpt4 book ai didi

mysql - 如何在关系数据库(MySql)中使用键值对?

转载 作者:行者123 更新时间:2023-11-29 16:00:47 25 4
gpt4 key购买 nike

我想使用关系数据库(MySql)将我的数据存储为键值对。

  • 我会得到不。动态键值对。
  • 我可以创建一个简单的表来将它们存储在单独的列中。
  • 值的类型可以是 int、varchar、text 或 date。

我面临的问题是:

当我需要对值应该是整数的键运行查询时,我需要使用大于或小于查询。当我需要在带有日期字段的查询之间使用时也是如此。

我怎样才能实现它?

------------------------------------------------------------ -编辑 - - - - - - - - - - - - - - - - - - - - - - - - ---

为了更清楚起见,我提供了这个问题的背景,我将其分为三个部分:1. 数据 2:用例 3. 可能的设计

<强>1。数据

假设我正在为一个国家/地区的人口普查创建数据存储**(仅作为示例)**。存储数据的字段对于男性、女性、男孩或女孩来说是不同的,并且也会根据人的职业而变化。字段的数量取决于要求,最多可以增加到 500 个或更多。

<强>2。使用案例

  1. 显示月收入在 7000 美元到 10000 美元之间的人员的分页列表。用户可以单击任何页码,数据库应直接获取该页码的数据。例如,如果我们在一个页面中显示 10 个结果,并且用户点击第 5 页,那么我们应该向他显示从 40 到 50 的人员列表。

  2. 属于特定组的一些值存储可能包含大量数据的描述。因此它们应该存储为文本。

<强>3。可能的设计

  1. 我可以为每种不同类型创建一个单独的表,并将其数据存储在各自的字段中。但我正在考虑这种方法的问题是 MySQL 表的最大行大小限制为 65,535 字节。采用这种方法并水平存储所有数据可能会超出最大大小限制。由于字段的数量不是固定的,可以根据需要进行更改。

  2. 我可以使用实体属性值设计(键值对)垂直存储数据,而不是水平存储数据。目前来看,由于这种设计而增加的行数并不是问题。使用这个我可以将所有男性、女性或 child 的数据存储在同一个表中。但这种方法的问题是:

    • 我将丢失某些重要字段的数据类型。无法查询并获取收入超过1000的人员名单。

    • 为了以单个值类型存储数据或所有字段,我需要将其设置为 varchar。但有些字段存储大量数据,需要 TEXT 作为类型。

    考虑到上述问题,我认为与其只创建一个值字段,不如创建多个值字段,例如 value_int、value_varchar、value_date 或 value_text。

DB structure

对于这个问题,我将使用MySQL,并且由于某些限制而无法更改数据库。所以我正在寻找一种仅使用 MySQL 的设计。

采用键值方法是一个好主意吗?或者可以使用任何其他可能的设计?

最佳答案

一般来说,如果您知道问题域的实体和属性,并且数据是相关的,我会使用关系模式(您的“可能的设计 1”)。如果您实际上遇到最大行宽度的问题,您的问题域可能包含属性的逻辑子组,因此您可以将它们拆分到单独的表中。

例如:

Person (id, name, ...)
Person_demographics (person_id, age, location, ...)
Person_finance (person_id, income, wealth...)

如果您提前知道实体和属性,我建议使用MySQL的JSON support.XML support 。这使您可以访问比 EAV 更好的查询选项。

在您的场景中,类似 EAV 的解决方案的问题在于,任何不平凡的查询最终都会变得极其复杂 - “查找工资在 x 和 y 之间、年龄为 z 的位置 (a, b) 中的所有响应, c)"变成了一堆可怕的 SQL,但是使用 XPath 这就非常简单了。

关于mysql - 如何在关系数据库(MySql)中使用键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56223795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com