mysql - 用于存储表达式及其在文本中出现的数据库模型

标签 mysql postgresql database-design

我正在做一个统计研究应用程序。我需要根据 2 个首字母存储单词,即 676 种组合,并且每个单词在文本中都有其出现次数(最小、最大、平均)。我不确定模型/架构应该是什么样子。将会有很多检查关键字是否已经被持久化。我很欣赏你的建议。

<小时/>

编辑:我将使用 mysql 或 postgresql + spring 模板

最佳答案

除非您有数百万个单词,否则仅存储它们的前缀似乎是一个糟糕的计划。

为了将新数据添加到表中,您可以简单地编写一个充满传入单词的临时表,然后在导入运行结束时一次性聚合和合并这些数据。也就是说,类似于:

BEGIN;
CREATE TEMP TABLE word_stage(word text) ON COMMIT DROP;
COPY word_stage FROM stdin;
-- use pgputcopydata to send all the words to the db...
SET work_mem = 256MB; -- use lots of memory for this aggregate..
CREATE TEMP TABLE word_count_stage AS
    SELECT word, count(*) as occurrences
    FROM word_stage
    GROUP BY word;
-- word should be unique, check that and maybe use this index for merging
ALTER TABLE word_count_stage ADD PRIMARY KEY(word);
-- this UPDATE/INSERT pair is not comodification-safe
LOCK TABLE word_count IN SHARE ROW EXCLUSIVE MODE;
-- now update the existing words in the main table
UPDATE word_count
SET word_count.occurrences = word_count.occurrences + word_count_stage.occurrences,
    word_count.min_occurrences = least(word_count.occurrences, word_count_stage.occurrences),
    word_count.max_occurrences = greatest(word_count.occurrences, word_count_stage.occurrences)
FROM word_count_stage
WHERE word_count_stage.word = word_count.word;
-- and add the new words, if any
INSERT INTO word_count(word, occurrences, min_occurrences, max_occurrences)
  SELECT word, occurrences, occurrences, occurrences
  FROM word_count_stage
  WHERE NOT EXISTS (SELECT 1 FROM word_count WHERE word_count.word = word_count_stage.word);
END;

因此,这会聚合一批单词,然后将它们应用到单词计数表中。在 word_stage(word)word_count(word) 上建立索引可以提供多种可能性,例如如果两个表都很大,则可以使用合并,而您无法通过尝试轻松做到这一点一次更新主表中的每一行。更不用说减少 word_count 中可能产生的垃圾量了。 (尽管在 word_count 上指定 60 左右的低填充因子是一个好主意,因为您知道它仍然会因更新而受到一些影响)。

如果您的输入实际上是单词/出现对而不仅仅是单词(您的文本不是很清楚),那么您可以取出初始的 word_stage 表,然后将其复制到 word_count_stage,或者您可能需要一个初始表并希望将 DISTINCT 值从该初始表复制到 word_count_stage

说真的,我会尝试至少在最初使用整个单词作为键 - 您引用的数字完全在可用性范围内。另请注意,我上面概述的加载方法可以很容易地修改为将单词截断为前两个字符(或以任何任意方式将其转换为内存键),方法是在数据移动到时进行转换。 word_count_stage 甚至在最后将转换放入更新/插入语句中(尽管您可能会失去在临时表上建立索引的好处)。

关于mysql - 用于存储表达式及其在文本中出现的数据库模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982611/

相关文章:

python - 如何在 appengine 中模拟追随者流?

mysql - 关联mysql中的两个表

sql - 为一对多表实现查找或插入

bash - 如何在包含来自 postgres 数据库的数据的 bash 脚本中创建变量

mysql - 如何组合两个不相关的 SQL 查询

php - 合并具有相同 pcode 的项目并计数为 1

ruby-on-rails - 在忽略 ruby​​ 中的日期组件时比较时间是否过去

mysql - 如何设置 MySQL 数据库关系

java - 从netbeans将数据插入到数据库mysql

mysql - 获取每组分组结果的前n条记录