データベースに、階層的な順序を表す 3 つのテーブルがあるとします。
countries
、states
、およびcities
各都市は 1 つの州に接続され、各州は 1 つの国に接続されます。これは、データベースで簡単に表現できます。
さらに、これらの各テーブルに field が含まれているとしますtax_rate
。基本的なケースでは、税率は国レベルおよびnull
その他すべてのレベルで定義されます。ただし、以下のいずれかのレベルで上書きされる可能性があります。
都市ノードを照会するときに、その税率を取得したいと考えています。同じノード内で定義することもできますが、次の上位レベルのいずれかで定義される可能性が高くなります。
MySQLまたはPHPレベルでこれを達成する最も効率的な方法は何ですか? 私の実際のアプリケーションでは、そのようなフィールドは 1 つだけではなく、多数あります。
以下は、私の例の単純なデータベース スキーマです。もちろん、外部キー定義も含まれます。
CREATE TABLE `countries` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tax_rate` float(4,2) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `countries` (`id`, `tax_rate`, `name`)
VALUES
(1,8.00,'Switzerland'),
(2,16.00,'Germany');
CREATE TABLE `cities` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`state_id` int(11) DEFAULT NULL,
`tax_rate` float(4,2) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
)
NSERT INTO `cities` (`id`, `state_id`, `tax_rate`, `name`)
VALUES
(1,1,NULL,'Bern'),
(2,1,NULL,'Zollikofen'),
(3,2,NULL,'Zurich'),
(4,2,5.30,'Wettingen'),
(5,2,NULL,'Winterthur'),
(6,2,6.60,'Handligen'),
(7,3,NULL,'Bayern-Town 1'),
(8,3,NULL,'Bayern-Town 2'),
(9,3,9.00,'Bayern-Town 3');
CREATE TABLE `states` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`country_id` int(11) DEFAULT NULL,
`tax_rate` float(4,2) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `states` (`id`, `country_id`, `tax_rate`, `name`)
VALUES
(1,1,NULL,'Bern'),
(2,1,9.00,'Zurich'),
(3,2,NULL,'Bavaria');