3

私の古いデータベースの設計は次のようでした

 id | name_en | title_en | name_ru | title_ru ...

データベース構造をかなり長い間変更せずに、言語の追加、投稿の削除などを行うことができる多言語 Web サイトの最適なデータベース構造を探していました。

最後に1つ作成しました。しかし、それが最適かどうかはわかりませんし、いくつかの致命的な問題があります:

言語テーブル - アプリケーション全体の言語のリストです

-- ----------------------------
-- Table structure for Language
-- ----------------------------
DROP TABLE IF EXISTS `Language`;
CREATE TABLE `Language` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `iso` varchar(3) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `order` tinyint(3) NOT NULL DEFAULT '0',
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

MenuTypeテーブル - サイドバー メニュー、トップ メニューなどのメニュー タイプ ...

-- ----------------------------
-- Table structure for MenuType
-- ----------------------------
DROP TABLE IF EXISTS `MenuType`;
CREATE TABLE `MenuType` (
  `id` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

メニュー表 - 親子構造に基づくすべてのメニュー項目。

-- ----------------------------
-- Table structure for Menu
-- ----------------------------
DROP TABLE IF EXISTS `Menu`;
CREATE TABLE `Menu` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id` int(11) unsigned DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `languageID` tinyint(3) unsigned DEFAULT NULL,
  `menuTypeID` tinyint(2) unsigned DEFAULT NULL,
  `order` int(2) DEFAULT NULL,
  `parent` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

ページテーブル - 多言語ページ テーブル

-- ----------------------------
-- Table structure for Page
-- ----------------------------
DROP TABLE IF EXISTS `Page`;
CREATE TABLE `Page` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `languageID` tinyint(3) unsigned DEFAULT NULL,
  `content` text COLLATE utf8_unicode_ci,
  `deleted` tinyint(1) DEFAULT NULL,
  `permalink` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

私のデザインはそのように機能します。私たちのプロジェクトが 2 つの言語で機能するとしましょう。英語 (language表の id 1) とロシア語 (language表の id 2)。これまでのページには、テーブルに 2 つのレコードがあります: like {uid - 1, id - 2 lang - 1 ...}; {uid - 2 , id - 2, lang - 2 ...}.

外部キーで ID を繰り返すため、深刻な問題が発生し、プログラムでそれを維持するのが難しいと思います。それを修正するための提案やその他の設計上の提案はありますか?

多言語データベースの設計アイデアを共有してください。

私はデータベースの経験がなく、プロジェクトで長時間使用するための堅実なデータベース設計が本当に必要です。

多言語の seo に適した URL、多言語の投稿で動作するデータベース設計が必要です。等..

前もって感謝します。

4

2 に答える 2

0

ページのコンテンツをデータベースに保存する理由がわかりません。ある種のバックエンドを介してページのコンテンツを変更できますか?

ユーザー入力による言語依存のコンテンツのみを保存します。その場合、私はあなたと同じデータベース設計を使用します。

ページが静的な場合は、ini ファイルから文字列を読み込み、その値をテンプレートに使用しました。

手順は次のとおりです。

  • キーと値のペアで ini ファイルを作成します。言語ごとに 1 つ。

文字列.en.txt:

title = Title
paragraph1 = This is the first paragraph.

文字列.es.txt

title = Título
paragraph1 = Este es el primer párrafo
  • ユーザー設定/ブラウザ言語に従って ini ファイルをロードします (最初は、$_SERVER['HTTP_ACCEPT_LANGUAGE'] で取得できます)。

$langs = parse_ini_file("strings.".$_SERVER['HTTP_ACCEPT_LANGUAGE'].".txt");

  • 文字列を変数に置き換えて HTML を生成します。私のphpファイルでは、変数 $lang にロード/解析することができ、HTMLコンテンツを生成するときに適切な変数を使用します。

    <h1><?php echo $lang['title'];?></h1> <p><?php echo $lang['paragraph1'];?></p>

最終的にこのソリューションを使用する場合は、テンプレート エンジン (smarty や twig など) を使用することをお勧めします。よりクリーンなコードが得られます。

于 2013-09-15T11:50:35.597 に答える