好问题。您对存储大量相似值的观察是有效的。
优化设计的一种解决方案是使用关系表架构。对于关系表,您可以在字段中获取常用值并将它们移动到另一个表中,然后创建指向该表的链接。
作为一个(不相关的)示例,与其将国家名称存储在一个字段中一百万次,不如创建一个指向国家列表的字段。好处是您将存储(一百万次)几个字节的数字,而(一百万次)几百字节的名称。
好处大于存储,因为比较数字比比较字符串更有效。例如,它需要计算机 ONE 比较来检查 if ($val == 10),与检查字符串中的每个字母(想象一下运行检查 if ($val = 'a very long string') 一百万次相比。
http://en.wikipedia.org/wiki/Relational_database
举个例子。假设您的关键字数量有限。
CREATE TABLE video
(
video_id int(11) NOT NULL auto_increment,
keyword_id int(11),
website varchar(255),
url string,
PRIMARY KEY (video_id)
);
CREATE TABLE keywords
(
keyword_id int(11) NOT NULL auto_increment,
keyword_name varchar(255),
PRIMARY KEY (keyword_id)
);
请注意,视频表有一个字段 keyword_id,而不是 keyword_name,因此这将存储一个数字,而不是一个字符串。您的数据示例将是
- video
id keyword_id url
1 1 http://domain1/path1/
2 2 http://domain2/path1/
3 2 http://domain3/path4/
:
- keywords
keyword_id keyword_name
1 short keyword
2 a long key that has many, many, many characters
如果你知道关键字id,那么搜索视频就很容易了。
SELECT keyword FROM keywords WHERE keyword_name = 'car';
:
SELECT * FROM video where keyword_id = ':keyword_id';
或
SELECT keyword_name, website, url
FROM video
JOIN keyword ON keyword_id
WHERE keyword_name = 'car'
我还看到了一些关于 SO 的帖子。
Relational Database Design Patterns?
Relational Database and Normalization for Relational Tables
Best way with relation tables