如何改进表数据库设计

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

【讨论】:

以上是关于如何改进表数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

如何改进基于订阅的计费系统的数据库设计?

表结构设计器(EZDML)1.98版公布

MySQL优化分析

团队项目----德州扑克数据库设计之改进版

如何适当地设计数据访问层?

数据建模工具------EZMNL