【问题标题】:Saving a Perl Hash (keys/values data structure) in MySQL field在 MySQL 字段中保存 Perl 哈希(键/值数据结构)
【发布时间】:2015-10-15 22:04:39
【问题描述】:

我有一个要保存在数据库字段 (MySQL) 中的 perl 哈希,以便立即检索它以进行更新。

相反,我想定义一个用于保存 perl 哈希的数据字段 (MySQL)。

这可能吗?实现它的最佳做法是什么?

【问题讨论】:

  • 如果你的很多数据都是这样的,考虑使用像MongoDB这样的NoSQL数据库。

标签: perl


【解决方案1】:

这是不可能的,因为哈希是内存中的数据结构。它可能有指针、缓冲区等。因此你不能把它塞进一个表空间。

可以做的是序列化它。把它变成一个单一的“东西”,然后你可以存储和检索它。

您可以使用多种方法来执行此操作 - 一些常见的方法可能是:

  • Storable(perl 中的核心,产生二进制数据并且不是特别便携)。
  • JSON - 很常见,因此很便携。生成纯文本。
  • XML - 类似于 JSON,但有一些不同的使用场景。

您使用哪个在很大程度上取决于您要完成的任务。一个非常粗略的例子可能是使用 Storable 中的 freeze/thaw 并通过 base64 将其编码为文本。

use strict;
use warnings;
use Storable qw ( freeze thaw );
use MIME::Base64;

my %test_hash = (
    "fish"   => "paste",
    "apples" => "pears"
);

my $frozen = encode_base64 freeze( \%test_hash );

my %new_hash =  %{ thaw (decode_base64 $frozen ) };
print Dumper $new_hash;

但这确实提出了一个问题——你为什么要尝试将一个散列——它是一个数据对象——打包到一个数据库中——该数据库是为处理数据对象而构建的。这样做会两全其美,因为您的数据库实际上对哈希内容视而不见。我建议您需要重新考虑您要在这里做什么。

编辑:从技术上讲,您也可以使用 Data::Dumper 执行此操作 - 它将变量打印为文本,您可以使用 eval。这是一个坏主意,因为虽然它看起来适用于琐碎的结构,但有一些陷阱(例如“父”引用)。而且您仍然必须将其读回并解析它,这就是您对JSONXML 所做的事情。你最终会以这种方式解决所有世界中最糟糕的问题。

【讨论】:

  • 嗯,你的速度更快。不错。
  • 虽然有一些补充。指出 Data::Dumper 不是这样做的正确方法并提及 Sereal。
【解决方案2】:

听起来不是个好主意,请参阅jeffa 对类似主题的回复:Store hash in mysql

我建议使用 Storable 将数据结构存储在文件中

use Storable;
store \%hash, 'file';
my $hashref = retrieve('file');

您可以尝试以下方法:

my @keys = keys %hash;    
my @values = values %hash;

my $sth = $dbh->prepare("INSERT INTO tablename(id, value) VALUES (?,?);");

$sth->execute_array({},\@keys, \@values);

【讨论】:

  • 也就是说,您建议创建一个表,其中列名将是哈希的键,字段值将是键的值?我将如何在数据库的逻辑/物理数据模型上呈现这样的表?在给定的时间,数据库将有 1000 个这样的表!我会给这些表起什么名字(动态的)?当我删除子表所引用的另一个表中的一个条目时,我将如何删除这些表?
【解决方案3】:

如果您确定您的数据可以序列化为 JSON,您可以使用 MySQL 的 JSON 数据类型的列。

“从 MySQL 5.7.8 开始,MySQL 支持原生 JSON 数据类型,可以高效访问 JSON(JavaScript 对象表示法)文档中的数据。”

【讨论】:

  • 必须从 5.6 升级到 5.7.8
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2012-08-10
  • 2023-04-07
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多