Quan hệ 1-1

Quan hệ 1-1

Ví dụ chúng ta tạo ra hai bảng UserUserProfile trong đó mỗi user có duy nhất một profile. Và mỗi profile thì thuộc về một user nào đó.

  • Ta gọi bảng User có mối quan hệ hasOne với bảng UserProfile.
  • Bảng UserProfile có mối quan hệ belongTo với bảng User.

Thiết kế bảng

Chúng ta thiết kế bảng UserUserProfile như sau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS user_profiles;

CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 
  -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL 
  -- id SERIAL PRIMARY KEY,  -- PostgreSQL
  name VARCHAR(255)
);

CREATE TABLE user_profiles (
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 
  -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL 
  -- id SERIAL PRIMARY KEY,  -- PostgreSQL
  user_id INTEGER,
  email VARCHAR(255),
  age INTEGER
);

INSERT INTO users (id, name) VALUES 
  (1, 'Nguyễn Ngọc Tuấn'),
  (2, 'Phan Thanh Bình');

INSERT INTO user_profiles (user_id, email, age) VALUES 
  (1, 'tuanngng@gmail.com', 15),
  (2, 'binhphth@gmail.com', 15);

Để ý là bảng user_profiles chứa id của bảng users. Tuy nhiên bảng users không chứa id của bảng user_profiles.

Truy vấn dữ liệu

Câu truy vấn dữ liệu trong hai bảng quan hệ 1-1 như sau:

1
2
3
4
SELECT users.id, users.name, user_profiles.email, user_profiles.age
  FROM users
  INNER JOIN user_profiles
  ON users.id = user_profiles.user_id;

Giá trị sẽ in ra:

+----+------------------------+--------------------+------+
| id | name                   | email              | age  |
+----+------------------------+--------------------+------+
|  1 | Nguyễn Ngọc Tuấn       | tuanngng@gmail.com |   15 |
|  2 | Phan Thanh Bình        | binhphth@gmail.com |   15 |
+----+------------------------+--------------------+------+