Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 我应该使用字符串表来提高数据库的效率吗?_Database_String_Performance - Fatal编程技术网

Database 我应该使用字符串表来提高数据库的效率吗?

Database 我应该使用字符串表来提高数据库的效率吗?,database,string,performance,Database,String,Performance,假设您有一个数据库,其中只有一个表,如 --------------------------------------------- | Name | FavoriteFood | --------------------------------------------- | Alice | Pizza | | Mark | Sushi |

假设您有一个数据库,其中只有一个表,如

---------------------------------------------
| Name    |  FavoriteFood                   |
---------------------------------------------
| Alice   | Pizza                           |
| Mark    | Sushi                           |
| Jack    | Pizza                           |
---------------------------------------------
使用另一个名为“Strings”的表来存储字符串,并将FavoriteFood列更改为字符串表中的索引,这样会更节省空间吗。在上面的示例中,“Pizza”看起来像是存储了两次,但是如果有额外的表,它似乎只存储了一次。当然,请假设有1000000行和1000个唯一字符串,而不是只有3行和2个唯一字符串

编辑:我们事先不知道最受欢迎的食物是什么:它们是用户提供的。字符串表的编程接口类似于

String GetString(int ID) { return String at with Row-ID == ID }

int GetID(String s) {
  if s exists, return row-id;
  else {
    Create new row;
    return new row id;
  }
}

因此,字符串表似乎更有效,但现代数据库是否已经在后台这样做了,所以我可以只使用简单的单表方法并提高效率?

您衡量效率的依据是什么?假设没有与每个FavoriteFood关联的其他数据(在这种情况下,显然您需要两个表),单表方法可能更省时,因为不必要的连接将产生额外的处理成本。另一方面,双表方法可能更节省空间,因为它比字符串占用更少的空间来存储索引,但这取决于您使用的特定数据库如何优化重复字符串的存储。

如果您有另一个表来存储字符串,当您想要更新描述时,这会更容易,例如,如果您需要将所有比萨更新为意大利比萨,那么如果您使用单独的表,您可以使用一行更新。另一个优点是翻译,您可以使用另一个表存储字符串在不同语言中的翻译,并根据当前语言选择一个


但这种方法的问题在于插入。您需要在两个表中插入,还需要维护外键约束,因此这会给一个简单的表增加一点复杂性。

您应该从问题域而不是效率的角度考虑什么是好的设计(除非您希望有数千万行)


一个设计良好的数据库应该是3NF(第三范式)。只有在通过测量确定了性能问题后,才能进行非规范化。

使用单独的“字符串”表的优点:

  • 如果字符串非常频繁地重复,则可能会减少空间
  • 可能是更快的典型查询-因为I\O更少
缺点:

  • 您将编写更复杂的查询 达到同样的效果
  • 如果重复系数很小, 您将获得更高的查询执行率 时间要将每个ID解析为字符串(或返回), 数据库服务器将执行单个查找 (搜索操作)每个ID。因此 附加日志(Strings.Count())因子 ~对于执行此操作的每个查询

但实际上这真的很有效。例如,大多数全文搜索引擎几乎使用这种方法来存储文档单词地图。

假设没有与食品相关的辅助数据(例如营养信息),那么他的设计已经在3NF中。不是每一个重复的数据位都必须是整数才能有一个正确的标准化数据库。@Tyler McHenry:我没说是的,是吗?我想说的是,设计比优化一个没有的性能问题更重要。我想说,在这种情况下使用非规范化数据的最佳理由仅仅是因为它是用户输入的数据。因此,让他们在已经输入的1000个字符串中找到已经输入的字符串是很困难的。不管怎样,每种东西最终都会有6种不同的变体,因为用户会希望是原创的,他们会说他们喜欢意大利香肠披萨,或者只加奶酪的披萨,或者上面有6种肉的披萨。尽管比萨饼就足够了,但你会得到6种不同的比萨饼,所以将其标准化没有多大意义。啊,“精心设计”!=在很多情况下都是3NF。@jfar:这不是我的经验。3NF是您应该设计的,然后可能(只是可能)在极端情况下,尽可能少地去规范化。如果3NF模式存在性能问题,则索引不正确。实际上,您是对的,连接过程将消耗更多的时间和性能,并且比重复的字符串记录更糟糕。