1

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

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

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

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

4

3 回答 3

1

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

于 2013-09-02T13:54:52.287 回答
1

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

可能的解决方案是:

  1. 如果 xml 文件不是非常大和复杂并且不包含很多不需要的信息,您可能不需要将此信息存储在您的数据库中。
  2. 在这种情况下,您可以将缓存层添加到您的应用程序中,该层将存储文件并重复从 thetvdb 获取它们,如果之前的请求太久之前。
  3. 如果您认为可以以更紧凑或更方便的方式将所需的信息发送给客户端,或者需要额外的处理,或者您计划将来对您的数据执行一些组操作,那么更好的选择是将数据存储在 db 中
  4. 还要考虑刷新数据库中的数据(类似于第二个选项)。
  5. 您也可以仅将关键信息存储在您的数据库中。

更新:通常我不建议使用本地数据库,因为将来它可能会导致架构迁移问题(当您想更改数据库架构中的某些内容时)。

于 2013-09-02T14:14:27.037 回答
0

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

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>
于 2013-09-03T00:11:14.030 回答