Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When I should use one to one relationship?

Sorry for that noob question but is there any real needs to use one-to-one relationship with tables in your database? You can implement all necessary fields inside one table. Even if data becomes very large you can enumerate column names that you need in SELECT statement instead of using SELECT *. When do you really need this separation?

like image 258
Pavel Shchegolevatykh Avatar asked Sep 07 '12 13:09

Pavel Shchegolevatykh


People also ask

When designing a database Why would you use a one-to-one relationship?

You would not have to change your database structure in the 1-to-1 relationship scenario, you only have to change how you handle the data coming back to you.

What is the difference between 1 to 1 and 1 to many relationship?

One-to-one relationships associate one record in one table with a single record in the other table. One-to-many relationships associate one record in one table with many records in the other table.

Which of the following is correct one-to-one relationship?

Third option is Correct. Explanation: There are three different types of data relationships in a database: one-to-one relationship: It is defined as the relationship between two tables where a row from table A is associated with at most one row in table B, and an row in table B is associated with one entity in table A.

How do you know if it is a one-to-many relationship?

For example, if one department can employ for several employees then, department to employee is a one to many relationship (1 department employs many employees), while employee to department relationship is many to one (many employees work in one department).


2 Answers

1 to 0..1

  • The "1 to 0..1" between super and sub-classes is used as a part of "all classes in separate tables" strategy for implementing inheritance.

  • A "1 to 0..1" can be represented in a single table with "0..1" portion covered by NULL-able fields. However, if the relationship is mostly "1 to 0" with only a few "1 to 1" rows, splitting-off the "0..1" portion into a separate table might save some storage (and cache performance) benefits. Some databases are thriftier at storing NULLs than others, so a "cut-off point" where this strategy becomes viable can vary considerably.

1 to 1

  • The real "1 to 1" vertically partitions the data, which may have implications for caching. Databases typically implement caches at the page level, not at the level of individual fields, so even if you select only a few fields from a row, typically the whole page that row belongs to will be cached. If a row is very wide and the selected fields relatively narrow, you'll end-up caching a lot of information you don't actually need. In a situation like that, it may be useful to vertically partition the data, so only the narrower, more frequently used portion or rows gets cached, so more of them can fit into the cache, making the cache effectively "larger".

  • Another use of vertical partitioning is to change the locking behavior: databases typically cannot lock at the level of individual fields, only the whole rows. By splitting the row, you are allowing a lock to take place on only one of its halfs.

  • Triggers are also typically table-specific. While you can theoretically have just one table and have the trigger ignore the "wrong half" of the row, some databases may impose additional limits on what a trigger can and cannot do that could make this impractical. For example, Oracle doesn't let you modify the mutating table - by having separate tables, only one of them may be mutating so you can still modify the other one from your trigger.

  • Separate tables may allow more granular security.

These considerations are irrelevant in most cases, so in most cases you should consider merging the "1 to 1" tables into a single table.

See also: Why use a 1-to-1 relationship in database design?

like image 95
Branko Dimitrijevic Avatar answered Nov 25 '22 18:11

Branko Dimitrijevic


My 2 cents.

I work in a place where we all develop in a large application, and everything is a module. For example, we have a users table, and we have a module that adds facebook details for a user, another module that adds twitter details to a user. We could decide to unplug one of those modules and remove all its functionality from our application. In this case, every module adds their own table with 1:1 relationships to the global users table, like this:

create table users ( id int primary key, ...); create table users_fbdata ( id int primary key, ..., constraint users foreighn key ...) create table users_twdata ( id int primary key, ..., constraint users foreighn key ...) 
like image 30
santiago arizti Avatar answered Nov 25 '22 18:11

santiago arizti