1

これは、パフォーマンスと実装についてもっとやらなければならない問題です。テレビ シリーズに関する情報を取得するためのアプリを作成し、thetvdb.com API を使用したいと考えています。thetvdb は、開始するための xml API といくつかのガイドを提供します。初期化のために、zipファイルをダウンロードする必要があると言われています(追加するシリーズのIDに従って)。

xml は 3 つの xml ファイルで構成されます。1 つは俳優に関するもの、もう 1 つはバナーに関するもの、もう 1 つはシーズンやエピソード、概要などを含むテレビ番組に関するすべての情報を含むも​​のです。ガイドによると、xml を解析し、必要に応じてデータベースのテーブルに追加するように指示されています。 .

私の質問は次のとおりです。xmlをダウンロードして解析し、データベースに保存してxmlを削除する方が良いですか? または、番組の情報を取得してユーザーに提示するたびに、xml を使用して解析する必要がありますか? 1 つの実装のコストと 2 つ目の実装のコストは?

私はまだそれを設計しているので、まだコードはありません。

4

3 に答える 3

1

適切なソリューションは、アプリケーションの負荷 (同時に使用するユーザーの数)、xml ファイルの平均サイズと構造、およびデータを更新する必要性に依存すると思います。

考えられる解決策は次のとおりです。

  1. xml ファイルがそれほど大きくなく複雑でなく、多くの不要な情報が含まれていない場合は、この情報をデータベースに保存する必要がない可能性があります。
  2. この場合、キャッシュ レイヤーをアプリに追加して、ファイルを保存し、前回のリクエストがかなり前の場合に thetvdb から繰り返し取得することができます。
  3. 必要な情報をよりコンパクトまたは便利な方法でクライアントに送信できると思われる場合、または追加の処理が必要な場合、または将来データに対していくつかのグループ操作を実行する予定がある場合は、データを db に保存することをお勧めします。
  4. また、データベース内のデータを更新することも検討してください (2 番目のオプションと同様)。
  5. また、重要な情報のみをデータベースに保存できます。

更新:通常、ローカル データベースの使用はお勧めしません。将来、スキーマの移行で問題が発生する可能性があるためです (db スキーマで何かを変更したい場合)。

于 2013-09-02T14:14:27.037 に答える
0

特定のクエリを実行する必要がある場合は、データベースにデータを格納するのが間違いなく最良の方法です。私は TheTVDB API (Wordpress に統合されています) も使用しており、PHP コードを提供できます。まず、次のコードを使用して DB を作成する必要があります。次に、テレビ番組の 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 に答える