0

メインカテゴリ(親列)に0が含まれ、サブカテゴリに親カテゴリのIDが含まれるcategoriesというラベルの付いたテーブルを作成しています。それは参照と呼ばれていると聞きました。私の質問:このテーブルは適切に構成されていますか?または、トラバーサルツリーまたは同様の方法を実装するようなより良い方法はありますか?

CREATE TABLE `categories` (
`primary_id` int(11) NOT NULL auto_increment,
`master_id` int(11) NOT NULL default '0',
`name` varchar(50) NOT NULL default '',
PRIMARY KEY (`c_id`)
)

INSERT INTO `categories` (`primary_id`, `master_id`, `name`) VALUES 
(1, '0', 'Games'),
(2, '0', 'Technology'),
(3, '0', 'Science'),
(4, '0', 'Pop Culture'),
(5, '0', 'Jobs/Services'),
(6, '0', 'Blogs'), 
(7, '1', 'Computer'),
(8, '1', 'Game Console'),
(9, '2', 'Cellphone'),
(10, '2', 'Audio/Video/Photos'),
(11, '2', 'Laptop'),
(12, '2', 'Others >'),
(13, '3', 'Human Body'),
(14, '3', 'Ocean Life'),
(15, '3', 'Plant Life'),
(16, '3', 'Animal Life'),
(17, '4', 'Artist'),
(18, '4', 'Upcoming'),
(19, '5', 'Jobs'),
(20, '5', 'Tutoring'),
(21, '5', 'Seminars'),
(22, '5', 'Haircuts'),
(23, '9', 'Iphone'),
(24, '9', 'Android'),
(25, '9', 'Windows Mobile'),
(26, '11', 'Toshiba'),
(27, '11', 'HP'),
(28, '11', 'Apple'),
4

1 に答える 1

1

InnoDBエンジンを使用する場合は、テーブルに参照整合性を適用できます。これにより、一致する親IDを持たないカテゴリを挿入したり、親を削除するときに子カテゴリをカスケード削除したりしないようにすることができます。createステートメントを次のように変更します。

CREATE TABLE `categories` (
`primary_id` int(11) NOT NULL auto_increment,
`master_id` int(11) NOT NULL default '0',
`name` varchar(50) NOT NULL default '',
PRIMARY KEY (`c_id`),
KEY `fk_master_id1` (`master_id`),
CONSTRAINT `fk_master_id1` FOREIGN KEY (`master_id`) REFERENCES `master` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

While this strategy works sufficiently well for most cases, you might also want to look at other strategies for implementing tree-like structures and the challenges that come with querying them effectively. See this answer on SO for more information on alternative designs for storing tree-like structures in MySQL.

于 2012-05-27T16:57:30.903 に答える