Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để cấu trúc một lược đồ cơ sở dữ liệu để cho phép trường hợp 1 trong một triệu?

Có vẻ như bạn quan tâm đến:

-- a and b are related by the association of interest
Foo(a, b)

-- foo(a, b) but not foo(a2, b) for some a2 <> a
Boring(a, b)
unique(b)
FK (a, b) references Foo

-- foo(a, b) and foo(a2, b) for some a2 <> a
Rare(a, b)
FK (a, b) references foo

Nếu bạn muốn truy vấn để không bị cản trở, chỉ cần xác định Foo. Bạn có thể truy vấn nó cho Rare.

Rare = select * from Foo f join Foo f2
    where f.a <> f2.a and f.b = f2.b

Bất kỳ thiết kế nào khác đều gặp phải sự phức tạp khi cập nhật trong việc giữ cho cơ sở dữ liệu nhất quán.

Bạn có chút lo lắng về việc Rare nhỏ hơn nhiều so với Foo. Nhưng yêu cầu của bạn là gì Chỉ có n trong một triệu bản ghi Foo là rất nhiều:rất nhiều trong số đó bạn sẽ chọn thiết kế nào khác?

Mức độ phức tạp tiếp theo là có Foo và Rare. Cập nhật phải giữ cho phương trình trên đúng.

Có vẻ như rất khó có lợi ích trong việc giảm 2 hoặc 3 trong một triệu dư thừa của Foo + Rare bằng cách chỉ có Boring + Rare và tạo lại Foo từ chúng. Nhưng có thể hữu ích khi xác định một chỉ mục duy nhất (b) cho Boring sẽ duy trì rằng a b trong đó chỉ có một a. Khi bạn cần Foo:

Foo = select * from Boring union select * from Rare

Nhưng các bản cập nhật của bạn phải duy trì điều đó

not exists (select * from Boring b join Rare r where b.b = r.b)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mySQL riêng biệt Tham gia?

  2. F # Beginner:lấy một mảng dữ liệu từ máy chủ

  3. Câu hỏi / gợi ý về mẫu lớp cơ sở dữ liệu PHP

  4. MySQL TẢI DỮ LIỆU với dữ liệu đa dòng

  5. Giao diện cơ sở dữ liệu GUI MySQL