如何设计模式来存储搜索关键字

Min*_*Thu 5 database-design

我正在做一个数据库设计,用于存储搜索表单的搜索关键字,用于按日期、月份和年份生成最流行的搜索关键字报告。我做了一个简单的架构:

CREATE TABLE SearchTerm (
 ID             INTEGER         PRIMARY KEY AUTOINCREMENT NOT NULL,
 SearchTerm     VARCHAR( 255 )  NOT NULL,
 Date           DATE            NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,表中的搜索词将是多余的,并使数据库增长更快。我想避免数据冗余。

此外,我不确定使用日期数据类型或 unix 时间戳是否会对更快地检索数据产生影响。

那么,我应该创建一个新表来存储通过 id 链接到主表的日期吗?例如,

CREATE TABLE SearchTerm (
 ID             INTEGER         PRIMARY KEY AUTOINCREMENT NOT NULL,
 SearchTerm     VARCHAR( 255 )  NOT NULL,
 Hit           INTEGER         NOT NULL,
 DateID         INTEGER         NOT NULL
);

CREATE TABLE DateofSearchTerm (
 DateID         INTEGER         PRIMARY KEY AUTOINCREMENT NOT NULL,
 Date           DATE            NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我关心的是随着数据库增长的性能。如果数据库设计不当,就会导致性能和瓶颈问题。

我的一个朋友做了一个分析网站,但进展不顺利。我发现表中有 300 万条记录,他的查询需要 3 多分钟才能返回结果。

而且他只创建了一张表,然后保存“事件名称”、“开始数据”、“结束日期”之类的。生成月报时,由于超时问题(服务器超时、查询超时、jquery响应超时)无法显示报告。

他的 SQL 查询太昂贵了。他在 sp 中使用 group by date 来获取每天和每月的用户数量。然后将结果传递给基于 Flash 的报告。我通过增加命令超时来修复它以查看报告。但我不认为这是一个好主意。数据还在继续增长,到今年年底将创下 4 个工厂的记录。在一天结束时,增加命令超时将不起作用。这个问题是弱数据库设计的结果。我不想跟着它。

请给我建议并分享您的经验以避免这些问题。我应该如何设计搜索词数据库架构?

Der*_*ney 4

首先,让我解决您对数据冗余的担忧。我同意你的观点,即第二种模式更有可能减少冗余,并且可能更接近我的想法。不过,需要注意的一件事是,这将是独特的搜索词。因此,除非您有某种方法来标准化数据,否则拼写错误将会出现并被视为不同的搜索词。

另外,我会切换将 searchTerm 链接到搜索日期的方式,以便 dateofSearchTerm 链接到搜索词(而不是相反)。

CREATE TABLE SearchTerm (
 ID             INTEGER         PRIMARY KEY AUTOINCREMENT NOT NULL,
 SearchTerm     VARCHAR( 255 )  NOT NULL,
 Hit           INTEGER         NOT NULL,
);


CREATE TABLE DateofSearchTerm (
 DateID         INTEGER         PRIMARY KEY AUTOINCREMENT NOT NULL,
 searchID       INTEGER         NOT NULL,
 Date           DATE            NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

searchTerm.ID将 searchID 设置为外键来引用以确保不存在孤立行(其中的行在 中DateofSearchTerm没有匹配的父行)也是一个好主意SearchTerm

至于你关于你朋友的轶事,我发现你在设计中最缺少的就是索引。一个包含 300 万个数据的表在使用适当的索引的情况下快速运行应该没有问题。

使用您的设计,您需要在searchTerm.searchTerm列和 上有一个索引DateofSearchTerm.date

我认为如果你按照建议创建searchID外键,它也将成为一个合适的索引。我不使用 SQL Server,所以我不知道外键是否需要索引,所以请确保它需要。