web-dev-qa-db-ja.com

検索用の動的テーブルを作成するための最良の方法

ドキュメントの表があります:

CREATE TABLE `docs` (
  `doc_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `doc_uuid` binary(16) NOT NULL,
  `sender_uuid` varchar(40) NOT NULL,
  `receiver_uuid` varchar(40) DEFAULT NULL,
  `chain_id` int(10) unsigned NOT NULL,
  `status` tinyint(4) NOT NULL COMMENT 'open,sent,inbox,read,etc',
  `date_created` int(10) unsigned NOT NULL DEFAULT '0',
  `date_changed` int(10) unsigned NOT NULL DEFAULT '0',
  `date_read` int(10) unsigned NOT NULL,
  `doc_date` int(10) unsigned NOT NULL,
  `doc_number` varchar(50) NOT NULL,
  `is_archive` tinyint(1) NOT NULL DEFAULT '0',
  `doc_hash` binary(16) NOT NULL COMMENT 'md5 of document data,
  PRIMARY KEY (`doc_id`),
  ... keys ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

これには、ドキュメントの必須フィールドが含まれています。

そして、私はドキュメント「インデックス」を含むテーブルを持っています

CREATE TABLE `docs_idexes` (
  `doc_id` int(10) unsigned NOT NULL,
  `created_from` binary(16) DEFAULT NULL,
  `is_signed` tinyint(1) NOT NULL DEFAULT '0',
  `encrypted` tinyint(1) NOT NULL DEFAULT '0',
  `file_name` varchar(255) DEFAULT NULL,
  `file_date` int(10) unsigned DEFAULT NULL,
  `inv_date` int(10) unsigned DEFAULT NULL,
  `inv_num` varchar(20) DEFAULT NULL,
  `error_code` int(10) unsigned DEFAULT NULL,
  `sub_doc_type_id` smallint(5) unsigned DEFAULT NULL,
  `sub_status_id` smallint(5) unsigned DEFAULT NULL,
  `action` tinyint(3) unsigned DEFAULT NULL,
  `buyer_uuid` varchar(40) DEFAULT NULL,
  `consignee_uuid` varchar(100) DEFAULT NULL,
  `consignor_uuid` varchar(40) DEFAULT NULL,
  `customer_uuid` varchar(40) DEFAULT NULL,
  `performer_uuid` varchar(40) DEFAULT NULL,
  `supplier_uuid` varchar(40) DEFAULT NULL,
  `delivery_place_uuid` varchar(40) DEFAULT NULL,
  `contract_date` date DEFAULT NULL,
  `contract_number` varchar(35) DEFAULT NULL,
  `delivery_date` int(10) unsigned DEFAULT NULL,
  `order_number` varchar(35) DEFAULT NULL,
  `order_date` int(10) unsigned DEFAULT NULL,
  `return_date` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`doc_id`),
  ... keys ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

問題は、インデックスが毎月追加されることです。そして、ALTER TABLEを実行するのは悪い考えです。

新しいインデックスを追加するときにALTER TABLEなしでデータベースアーキテクチャを作成する最良の方法は何ですか?

1
smie

XMLやJSONなどの非構造化列タイプを使用できます。ただし、MySQLはこれらのタイプのAFAIKをサポートしていません。これらのタイプをMySQLに文字列として保存することはできますが、お勧めしません。その理由は、XML/JSONの1つの値を変更する必要がある場合は、文字列全体を変更するか、何らかの方法でRegExを使用して解析する必要があるためです。不快な。

したがって、非構造化タイプを使用するには、別のRDBMSに移動する必要があります。 MariaDBにはいくつかの JSONサポート があります。 MySQLからMariaDBへの切り替えは簡単に移行できるはずです。DigitalOceanのこれを参照してください ガイド

RDBMSを変更したくない場合は、Philが言及したEAVモデルが最良の選択だと思いますが、データが大きくなるにつれてパフォーマンスが低下する傾向があります。フィルタリングされたインデックスは役に立ちますが、MySQLではAFAIKも利用できません。

0
James Anderson