Dan Sewell
Dan Sewell

Reputation: 1290

Is many to many needed on this DB?

I am designing a DB for a possible PHP MySQL project I may be undertaking. I am a complete novice at relational DB design, and have only worked with single table DB's before.

This is a diagram of the tables:

My tables

So, 'Cars' contains each model of car, and the other 3 tables contains parts that the car can be fitted with. So each car can have different parts from each of the three tables, and each part can be fitted to different cars from the parts table. In reality, there will be about 10 of these parts tables.

So, what would be the best way to link these together? do I need another table in the middle etc? and what would I need to do with keys in terms of linking.

Upvotes: 1

Views: 109

Answers (2)

Wolfgang Fahl
Wolfgang Fahl

Reputation: 15769

There is some inheritance in your parts. The common attributes seem to be:

  • part_number
  • price

and there are some specifics for your part types exhaust, software and intake. There are two strategies: - have three tables and one view over the three tables - have one table with a parttype column and may be three views for the tables.

If you'd like to play with your design you might want to look at my companies website http://www.uml2php.com. UML2PHP will automatically convert your UML design to a database design and let you "play" with the result.

At: http://service.bitplan.com/uml2phpexamples/carparts/ you'll find an example applicaton along your design. The menu does not allow you to access all tables via the menu yet.

via: http://service.bitplan.com/uml2phpexamples/carparts/index.php?function=dbCheck

the table definitions are accessible:

mysql> describe CP01_car;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| oid         | varchar(32)   | NO   |     | NULL    |       |
| car_id      | varchar(255)  | NO   | PRI | NULL    |       |
| model       | varchar(255)  | YES  |     | NULL    |       |
| description | text          | YES  |     | NULL    |       |
| model_year  | decimal(10,0) | YES  |     | NULL    |       |
+-------------+---------------+------+-----+---------+-------+

mysql> describe CP01_part;

+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| oid         | varchar(32)  | NO   |     | NULL    |       |
| part_number | varchar(255) | NO   | PRI | NULL    |       |
| price       | varchar(255) | YES  |     | NULL    |       |
| car_car_id  | varchar(255) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

mysql> describe cp01_exhaust;

+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| oid         | varchar(32)  | NO   |     | NULL    |       |
| type        | varchar(255) | YES  |     | NULL    |       |
| part_number | varchar(255) | NO   | PRI | NULL    |       |
| price       | varchar(255) | YES  |     | NULL    |       |  
+-------------+--------------+------+-----+---------+-------+

mysql> describe CP01_intake;

+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| oid         | varchar(32)  | NO   |     | NULL    |       |
| part_number | varchar(255) | NO   | PRI | NULL    |       |
| price       | varchar(255) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

mysql> describe CP01_software;

+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| oid         | varchar(32)   | NO   |     | NULL    |       |
| power_gain  | decimal(10,0) | YES  |     | NULL    |       |
| part_number | varchar(255)  | NO   | PRI | NULL    |       |
| price       | varchar(255)  | YES  |     | NULL    |       |
+-------------+---------------+------+-----+---------+-------+

The above tables have been generated from the UML model and the result does not fit your needs yet. Especially if you think of having 10 or more table likes this. The field car_car_id that links your parts to the car table should be available in all the tables. And according to the design proposal the base "table" for the parts should be a view like this:

mysql>

create view partview as 
select       oid,part_number,price from CP01_software 
union select oid,part_number,price from CP01_exhaust 
union select oid,part_number,price from CP01_intake;

of course the car_car_id column also needs to be selected;

Now you can edit every table by itself and the partview will show all parts together. To be able to distinguish the parts types you might want to add another column "part_type".

Upvotes: 1

Opi
Opi

Reputation: 1308

I would do it like this. Instead of having three different tables for car parts:

  • table - cars table - parts (this would have only an id and a part number and a type maybe)
  • table - part_connections (connectin cars with parts)
  • table - part_options (with all the options which arent in the parts table like "power gain")
  • table - part_option_connections (which connects the parts to the various part options)

In this way it is much easier to add new parts (because you won't need a new table) and its closer to being normalized as well.

Upvotes: 1

Related Questions