我正在开发一个包含来自已抓取网站的数据的分析应用程序。
现在,已爬网的数据存储在不同的行中,导致大量重复。
我将举例说明情况:
抓取工具转到Google.com和Yahoo.com,并找出每个网站上的主要关键字。
对于Google,关键字是"搜索"和#34;互联网",对于雅虎,关键字是"搜索"和"新闻"。 (关键字的准确性在本例中并不重要。)
然后将这些关键字插入keywords
表:
KEYWORDS
---------------------------
ID
Keyword
Created_at
insert into keywords (Keyword, Created_at) values ('Search', now)
insert into keywords (Keyword, Created_at) values ('Internet', now)
insert into keywords (Keyword, Created_at) values ('Search', now)
insert into keywords (Keyword, Created_at) values ('News', now)
正如您所看到的,Google和Yahoo的关键字都已插入到数据库中。但问题在于搜索'现在在数据库中两次。
出于分析目的,我需要记录谷歌和雅虎都有关键字'搜索' (为了保持这个例子简单,我排除了任何外键),所以我不能简单地添加“搜索”#39;如果它已存在于数据库中。
所以这是我的问题:
我想只存储一次关键字(第一次找到它),而且我还需要一个相应的记录来记录每次找到它。
所以它几乎就像我需要这样的东西:
KEYWORDS KEYWORDS_FREQUENCY
--------------------------- ---------------------------
ID ID
Keyword (unique) Keyword_ID
Created_at
但我不确定我是否会以错误的方式思考这个问题。我还担心分析查询会因为需要加入而变得非常慢,而简单的冗余设计(上面描述的原始设计)可能会非常快,因为它是一个很大的哑桌。
如果你能理解我想要达到的目标,你能否就如何设计这个问题给我建议?
谢谢。
答案 0 :(得分:0)
将原点添加为列,例如:
KEYWORDS
---------------------------
ID
Keyword
Created_at
Origin
insert into keywords (Keyword, Created_at, Origin) values ('Search', now, 'Google')
insert into keywords (Keyword, Created_at, Origin) values ('Internet', now, 'Google')
insert into keywords (Keyword, Created_at, Origin) values ('Search', now, 'Yahoo')
insert into keywords (Keyword, Created_at, Origin) values ('News', now, 'Yahoo')
答案 1 :(得分:0)
TL; DR 您没有理由引入字符串ID,但避免重复始终是一个好的开始。
在数据库中出现多次相同值的意义上,“冗余”本身并不是问题。在您自己的提案中,引入的 id 值恰好出现在它们相应的字符串值出现的位置,因此还添加了一个从id到string的映射表将非必要数据添加到数据库中,这在另一种意义上显然是“多余的”。 (其中包括随之而来的“冗余”连接。)当多行在他们对应用情况的陈述中重叠时会产生有意义的冗余,并且当不按照良好的设计原则进行组织控制时,会出现有问题的冗余。
您对ids的关注似乎正在尝试解决您通过数据压缩解决的预期性能问题。对于您的特定DBMS和更新模式&查询,一个设计可能有某种实现性能问题可能被改进(以复杂性,可维护性和仅仅不同的权衡为代价时间和空间)由另一个。但假设它没有道理。
您可能想要为每次出现的值(通常使用自动增量ID DBMS工具)或其出现次数计算唯一标识符。这个和允许重复的好处是你的表是 relations ,因为根据逻辑条件表示的泛型属性查询数据的DBMS实现是基于表是关系的。 (基本上,要使用逻辑条件进行查询,您必须将具有重复项的表示转换为没有的表示,然后查询,然后如果需要转换回具有重复项的表示。)另一方面,性能再次可能导致您的存储列表值而不是关系,插入更快,而查询更慢。
始终从最简单的设计开始。关系表包含从表中填充真实语句(命题)的行填充空白句子模板(谓词)。选择足够的表/谓词,以便能够描述可能出现的任何应用情况。在证明问题时进行优化,并证明您的“优化”是“更好”。