如何改进表数据库设计
Posted
技术标签:
【中文标题】如何改进表数据库设计【英文标题】:How Improve table database design 【发布时间】:2013-12-09 04:11:13 【问题描述】:我正在为我的项目网站规划我的数据库方案设计。
这是video
表:
在“汽车”标签页面中,我以这种方式从表中检索(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
表中存储数百万行,即 5000 万行,这个表方案设计好还是我需要创建一些不同的东西?
感谢您的建议
【问题讨论】:
如果视频在多个网站上怎么办?您如何处理多个“关键字”? 我建议你使用:datatables.net 【参考方案1】:在keyword
列上有一个适当的索引,这个设计应该没问题。但是,如果您打算在表中存储如此大量的数据,则绝对应该考虑在 SQL 查询中引入分页。
【讨论】:
感谢您的建议。关键字列上的“正确索引”是什么意思? 只需在此列上创建一个索引:***.com/a/2955470/29407 如果您不知道 SQL 中的索引是什么并打算在一个表中存储 50M 条记录,我强烈建议您阅读这样做之前的索引:-)【参考方案2】:好问题。您对存储大量相似值的观察是有效的。
优化设计的一种解决方案是使用关系表架构。对于关系表,您可以在字段中获取常用值并将它们移动到另一个表中,然后创建指向该表的链接。
作为一个(不相关的)示例,与其将国家名称存储在一个字段中一百万次,不如创建一个指向国家列表的字段。好处是您将存储(一百万次)几个字节的数字,而(一百万次)几百字节的名称。
好处大于存储,因为比较数字比比较字符串更有效。例如,它需要计算机 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
【讨论】:
以上是关于如何改进表数据库设计的主要内容,如果未能解决你的问题,请参考以下文章