我正在为我的项目网站规划我的数据库方案设计。
这是video
表:
在“car”标签页面中,我以这种方式从表中检索(PHP查询):
sql = "SELECT * FROM `video` WHERE keyword='car'";
$result = $db->query($sql);
if (!$result) {
}
<?php while ($row = $result->fetch_assoc()) { ?>
<?php echo $row['website']; ?><br>
<?php echo $row['url']; ?><br><br>
<?php } ?>
这是一个问题:如果我在video
表格中存储数百万行,即50万行,这个表格方案设计是好还是我需要创建不同的东西?
感谢任何建议
答案 0 :(得分:2)
在keyword
列上使用适当的索引,此设计应该没问题。但是,如果您打算在表中存储如此大量的数据,那么您应该考虑在SQL查询中引入分页。
答案 1 :(得分:1)
好问题。您对存储大量相似值的观察是有效的。
优化设计的解决方案是使用关系表架构。使用关系表,您可以在字段中获取常用值并将它们移动到另一个表,然后创建指向表的链接。
作为一个(不相关的)示例,不是将国家/地区名称存储在字段中一百万次,而是创建一个指向国家/地区列表的字段。好处是你将为一个数字存储(一百万次)几个字节,相比之下(百万次)几百字节的名称。
优势大于存储,因为比字符串比数字更有效。例如,它需要计算机ONE比较来检查是否($ val == 10),相比之下,对一个字符串中的每个字母进行一次检查(想象一下运行检查if($ val ='一个非常长的字符串')一百万次。
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?