创建数据库或使用xml

时间:2013-09-02 13:51:42

标签: sql xml database

这是一个必须在性能和实施方面做得更多的问题。我想创建一个应用程序来获取有关电视连续剧的信息,并希望使用thetvdb.com api。 thetvdb提供了一个xml api和一些指南,让你开始。对于初始化,他们说你必须下载一个zip文件(根据你要添加的系列的id)。

xml由三个xml文件组成。一个是关于演员,一个是关于横幅和一个有关于电视节目的所有信息包括季节和剧集和概述等。指南说你解析xml并将它们添加到您的数据库的表中,如你所愿。

我的问题是以下:下载xml解析它并将其存储在我的数据库并删除xmls是否更好?或者我应该使用xmls并在每次想要获取节目的信息并将其呈现给用户时解析它们?一个实现的成本是多少,第二个实现的成本是多少?

还没有代码,因为我还在设计它。

3 个答案:

答案 0 :(得分:1)

我肯定会解析xml文件并将它们放入数据库中。解析xml文件有相当大的开销 - 关系数据库的设计目的是查询它们内部的数据,并且非常高效(特别是如果你很好地设计数据库,在表之间提供有用的索引和逻辑连接。

答案 1 :(得分:1)

我认为正确的解决方案可能取决于您的应用程序负载(有多少用户将同时使用它),xml文件的平均大小和结构以及刷新数据的需要。

可能的解决方案是:

  1. 如果xml文件不是很大而且复杂且不包含大量不需要的信息,您可能不需要在数据库中存储此信息。
  2. 在这种情况下,您可以将缓存图层添加到您的应用程序中,该应用程序将存储文件,如果之前的请求时间过长,则会反复从thetvdb中获取这些文件。
  3. 如果您认为可以以更紧凑或方便的方式向客户端发送所需信息,或者需要额外处理,或者您计划在将来对数据执行某些组操作,那么更好的选择是存储db中的数据
  4. 还要考虑刷新数据库中的数据(类似于第2个选项)。
  5. 此外,您只能在数据库中存储关键信息。
  6. 更新:通常我不建议使用本地数据库,因为将来它可能会导致架构迁移出现问题(当您想要更改数据库架构中的某些内容时)。

答案 2 :(得分:0)

如果必须执行特定查询,将数据存储到数据库中绝对是最好的方法。我也使用TheTVDB API(集成在Wordpress中),我可以给你一些PHP代码。首先,你必须使用以下代码创建数据库,然后你有PHP脚本从电视节目的XML网址插入数据。

SQL查询:

CREATE TABLE IF NOT EXISTS `tvshowsinfo` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `showname` varchar(255) CHARACTER SET utf8 NOT NULL,
  `lang` varchar(255) CHARACTER SET utf8 NOT NULL,
  `episodeid` int(9) NOT NULL,
  `episodenumber` int(5) NOT NULL,
  `season` int(5) NOT NULL,
  `director` varchar(255) CHARACTER SET utf8 NOT NULL,
  `episodename` varchar(255) CHARACTER SET utf8 NOT NULL,
  `firstaired` varchar(255) CHARACTER SET utf8 NOT NULL,
  `gueststars` text CHARACTER SET utf8 NOT NULL,
  `overview` text CHARACTER SET utf8 NOT NULL,
  `rating` varchar(255) CHARACTER SET utf8 NOT NULL,
  `ratingcnt` int(9) NOT NULL,
  `writer` varchar(255) CHARACTER SET utf8 NOT NULL,
  `episodeimg` varchar(255) CHARACTER SET utf8 NOT NULL,
  `seasonid` int(9) NOT NULL,
  `seriesid` int(9) NOT NULL,
  `thumbht` int(4) NOT NULL,
  `thumbwd` int(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

PHP / Wordpress脚本:

<?php
$url = "Your URL";
$xmlstr = file_get_contents($url);
$elements = json_decode(json_encode((array)simplexml_load_string($xmlstr)),1);

global $wpdb;

$mquery = "INSERT INTO tvshowsinfo (showname,lang,episodeid,episodenumber,season,director,episodename,firstaired,gueststars,overview,rating,ratingcnt,writer,episodeimg,seasonid,seriesid,thumbht,thumbwd) VALUES ";
$i = 0;
foreach ($elements['Episode'] as $element) {
    if ($i !== 0) { $mquery .= ", "; }
    if ($element["Combined_season"] !== "0") {
        $mquery .= "('".mysql_real_escape_string($_POST["seriesname"])."', '".$element["Language"]."', '".$element["id"]."', '".$element["Combined_episodenumber"]."', '".$element["Combined_season"]."', '".mysql_real_escape_string($element["Director"])."', '".mysql_real_escape_string($element["EpisodeName"])."', '".$element["FirstAired"]."', '".mysql_real_escape_string($element["GuestStars"])."', '".mysql_real_escape_string($element["Overview"])."', '".$element["Rating"]."', '".$element["RatingCount"]."', '".mysql_real_escape_string($element["Writer"])."', 'http://thetvdb.com/banners/".$element["filename"]."', '".$element["seasonid"]."', '".$element["seriesid"]."', '".$element["thumb_height"]."', '".$element["thumb_width"]."')";
        $i++;
    }
} 

$wpdb->query($mquery);
$wpdb->print_error();

/* DEBUG */

?>

<pre><?php print_r($elements); ?></pre>