I would use one table for all categories, with optional parent_id, as such:
CREATE TABLE `categories` (
`id` INT unsigned NOT NULL AUTO_INCREMENT,
`parent_id` INT NULL,
`title` varchar(75) NOT NULL,
PRIMARY KEY(`id`),
KEY `parent` (`parent_id`)
);
-- Insert your sample data
INSERT INTO `categories` (`id`,`parent_id`,`title`) VALUES
(1,NULL,'Programming and Databases'),
(2,1,'Web Development'),
(3,2,'Web Design'),
(4,3,'Graphic Design'),
(5,4,'Logo Design'),
(6,2,'Programming'),
(7,6,'PHP'),
(8,NULL,'Marketing & Communications'),
(9,8,'Market Research'),
(10,0,'Admin Support');
Then I would use a many-to-many matching table to represent the choices, below is a basic posting table, and the matching table:
CREATE TABLE `postings` (
`id` INT unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(75) NOT NULL,
`desc` TEXT NOT NULL,
PRIMARY KEY(`id`)
);
-- Insert the posting
INSERT INTO `postings` (`id`,`title`,`desc`) VALUES (1,'Saint4''s Sample Job','Just a sample posting to illustrate');
CREATE TABLE `posting_category` (
`posting_id` INT unsigned NOT NULL,
`category_id` INT unsigned NOT NULL,
KEY `post_cat` (`posting_id`,`category_id`)
);
-- Insert the picks for the posting
INSERT INTO `posting_category` (`posting_id`,`category_id`) VALUES
(1,5),
(1,7),
(1,9),
(1,10);
Then finding the selected categories is as simple as issuing a joined select such as
SELECT `id` FROM `categories` c LEFT JOIN `posting_category` pc ON pc.`category_id` = c.`id` WHERE pc.`posting_id` =1
then when looping thru the categories to create the check boxes, you simply check if that categories ID is in the result set. Hope this gives you a good idea of how I'd do it. If you have more questions feel free to ask I'm sure I didn't explain what I'm thinking very well!