I'm building a small application and setting up foreign key relationships between tables. However I'm confused as to WHY I really need this? What is the advantage - does it assist me when writing my queries that I don't have to perform any joins? Here's an example snippet of my database:
+-------------------+
| USERS |
+-------------------+
| user_id |
| username |
| create_date |
+-------------------+
+-------------------+
| PROJECTS |
+-------------------+
| project_id |
| creator |
| name |
| description |
+-------------------+
There is a key relationship between users
.user_id
and projects
.creator
Would I be able to perform a query like so?
SELECT * FROM PROJECTS WHERE USERS.username = "a real user";
Since MySQL should know the relationship between the tables? If not then what is the real function of Foreign keys in a database design?
Foreign keys provide referential integrity. The data in a foreign key column is validated - the value can only be one that already exists in the table & column defined in the foreign key. It's very effective at stopping "bad data" - someone can't enter whatever they want - numbers, ASCII text, etc. It means the data is normalized - repeating values have been identified and isolated to their own table, so there's no more concerns about dealing with case sensitivity in text... and the values are consistent. This leads into the next part - foreign keys are what you use to join tables together.
Your query for the projects a user has would not work - you're referencing a column from the USERS
table when there's no reference to the table in the query, and there's no subquery being used to get that information before linking it to the PROJECTS
table. What you'd really use is:
SELECT p.*
FROM PROJECTS p
JOIN USERS u ON u.user_id = p.creator
WHERE u.username = 'John Smith'
Basically, they won't give you any more functionality. They stop any inserts or updates breaking the referential integrity of your data model.
Another key aspect in my opinion is that they communicate the data model to any other developers using it. I have often looked at what foreign keys a table has to see how the data model fits together at a glance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With