When I designed up the relationship between US regions, divisions and states I thought it out as 2 relationships which would ultimately define a 3rd relationship (indirectly.)
Direct Relationships
- divisions(
regionid) -> us_regions(id) - state(
divisionid) -> divisions(id)
Indirect Relationships
- state(
divisionid) -> divisions(id) | divisions(regionid) -> us_regions(id)
Making it obvious that I could query out with multiple joins what states are in a region even though the states table doesn’t directly relate to the region table it’s the state to division to region relationship that defines what states are in a region.
I thought about having regions and devisions in the same table and doing a self join but I didn’t really see a benefit to using a parent/child relationship for these needs.
Enough talk, let’s build the tables.
Starting with the regions:
MySQL
## us_regions Table
#------------------------
#| id | name | censusid |
#| | | |
#------------------------
CREATE TABLE `us_regions` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 100 ) NOT NULL ,
`censusid` SMALLINT UNSIGNED NOT NULL
) ENGINE = MYISAM;
The only reason I add censusid as a field to these tables is in case we ever need to reference back to the census, maybe a few years down the road with a feed or something. It’s a small amount of data that could eventually be very helpful for relating to outside information.
Now divisions
MySQL
## us_divisions Table
#-----------------------------------
#| id | name | censusid | regionid |
#| | | | |
#-----------------------------------
CREATE TABLE `us_divisions` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 100 ) NOT NULL ,
`censusid` SMALLINT NOT NULL ,
`regionid` INT UNSIGNED NOT NULL
) ENGINE = MYISAM;
Populating Regions and Divisions
We could make a fancy application with a CMS and forms to populate this data but there’s thirteen records total in these fields, I’ll be doing it by hand.
MySQL
INSERT INTO `us_regions`(`id`,`name`,`censusid`)
VALUES (1 , 'Northeast', '1'),
(2 , 'Midwest', '2'),
(3 , 'South', '3'),
(4 , 'West', '4');
We had to define the regions first so we can make the relationship from divisions to regions when we manually add the divisions.
MySQL
INSERT INTO `us_divisions`(`id`,`name`,`censusid`,`regionid`)
VALUES (NULL , 'New England', '1', '1'),
(NULL , 'Middle Atlantic', '2', '1'),
(NULL , 'East North Central', '3', '2'),
(NULL , 'West North Central', '4', '2'),
(NULL , 'South Atlantic', '5', '3'),
(NULL , 'East South Central', '6', '3'),
(NULL , 'West South Central', '7', '3'),
(NULL , 'Mountain', '8', '4'),
(NULL , 'Pacific', '9', '4');
This time we let the auto-increment id do it’s thing, we implicitly defined it in the regions table so we could be sure we had the right id for the relationships.
Pages: 1 2
This site runs on the Thesis WordPress Theme
If you're someone who doesn't understand a lot of PHP, HTML, or CSS, Thesis will give you a ton of functionality without having to alter any code. For the advanced, Thesis has incredible customization possibilities via extensive hooks and filters. And with so many design options, you can use the template over and over and never have it look like the same site.
If you're more familiar with how websites work, you can use the fantastic Thesis User's Guide and world-class support forums to make more professional customizations than you ever thought possible. The theme is not only highly customizable, but it allows me to build sites with a much more targeted focus on monetization than ever before. You can find out more about Thesis below:










