ドキュメントの表があります:
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
なしでデータベースアーキテクチャを作成する最良の方法は何ですか?
XMLやJSONなどの非構造化列タイプを使用できます。ただし、MySQLはこれらのタイプのAFAIKをサポートしていません。これらのタイプをMySQLに文字列として保存することはできますが、お勧めしません。その理由は、XML/JSONの1つの値を変更する必要がある場合は、文字列全体を変更するか、何らかの方法でRegExを使用して解析する必要があるためです。不快な。
したがって、非構造化タイプを使用するには、別のRDBMSに移動する必要があります。 MariaDBにはいくつかの JSONサポート があります。 MySQLからMariaDBへの切り替えは簡単に移行できるはずです。DigitalOceanのこれを参照してください ガイド 。
RDBMSを変更したくない場合は、Philが言及したEAVモデルが最良の選択だと思いますが、データが大きくなるにつれてパフォーマンスが低下する傾向があります。フィルタリングされたインデックスは役に立ちますが、MySQLではAFAIKも利用できません。