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

Làm thế nào để thiết kế một cơ sở dữ liệu phim?

Bạn phải phân biệt giữa thuộc tính và thực thể. Thực thể là một sự vật - thường là một danh từ. Một thuộc tính giống như một phần thông tin mô tả hơn. Trong biệt ngữ cơ sở dữ liệu, entity =table, thuộc tính =field / column.

Có một bảng riêng cho những thứ nhất định, chúng ta hãy sử dụng giám đốc, làm ví dụ, được gọi là chuẩn hóa. Mặc dù nó có thể tốt trong một số trường hợp, nhưng nó có thể không cần thiết trong những trường hợp khác (vì nói chung nó làm cho các truy vấn phức tạp hơn - bạn phải tham gia mọi thứ - và nó chậm hơn).

Trong trường hợp này, việc có một bảng năm là không cần thiết, vì không có thuộc tính nào khác về một năm, ngoài bản thân năm, mà bạn sẽ lưu trữ. Tốt hơn là không chuẩn hóa điều này và lưu trữ năm trong bảng phim.

Mặt khác, giám đốc thì khác. Có lẽ bạn sẽ muốn lưu trữ tên, họ, ngày sinh, ngày mất của đạo diễn (nếu có), v.v. Bạn rõ ràng không muốn nhập ngày sinh của đạo diễn mỗi khi vào phim mà người này. chỉ đạo, vì vậy sẽ có ý nghĩa khi có một thực thể riêng cho một giám đốc.

Ngay cả khi bạn không muốn lưu trữ tất cả thông tin này về giám đốc (bạn chỉ muốn có tên của họ), thì việc có một bảng riêng cho nó (và sử dụng khóa thay thế - tôi sẽ chuyển đến điều đó trong giây lát) rất hữu ích vì nó ngăn lỗi đánh máy và trùng lặp - nếu tên của ai đó viết sai chính tả hoặc nhập khác (đầu tiên, cuối cùng so với cuối cùng, đầu tiên), thì nếu bạn cố gắng tìm các phim khác mà họ đã đạo diễn, bạn sẽ thất bại.

Sử dụng một khóa thay thế (khóa chính) cho các bảng nói chung là một ý kiến ​​hay. So khớp một số nguyên nhanh hơn nhiều so với khớp một chuỗi. Nó cũng cho phép bạn tự do thay đổi tên mà không cần lo lắng về các khóa ngoại được lưu trong các bảng khác (ID được giữ nguyên nên bạn không phải làm gì cả).

Bạn thực sự có thể đưa thiết kế này đi khá xa, và tất cả chỉ là việc tìm ra thứ bạn muốn để có thể lưu trữ trong đó.

Ví dụ:thay vì có một đạo diễn duy nhất cho mỗi phim, một số bộ phim có nhiều đạo diễn .. vì vậy sẽ có mối quan hệ nhiều đến nhiều giữa các bộ phim và đạo diễn, vì vậy bạn cần một bảng với ví dụ:

films_directors => **filmid, directorid**

Tiến thêm một bước nữa, đôi khi đạo diễn cũng là diễn viên và ngược lại. Vì vậy, thay vì thậm chí có bàn đạo diễn và diễn viên, bạn có thể có một bàn người duy nhất và tham gia bàn đó bằng cách sử dụng một bảng phân vai. Bảng vai trò sẽ giữ nhiều vị trí khác nhau - ví dụ:đạo diễn, nhà sản xuất, ngôi sao, phụ, phụ trách, biên tập viên .. và nó sẽ giống như sau:

films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**

Bạn cũng có thể có trường role_details trong bảng film_people, có thể chứa thông tin bổ sung tùy thuộc vào vai trò (ví dụ:tên của phần diễn viên đang đóng).

Tôi cũng đang chiếu các thể loại như một <> nhiều mối quan hệ, bởi vì có thể một bộ phim thuộc nhiều thể loại. Nếu bạn không muốn điều này, thì thay vì bảng film_genre, các bộ phim sẽ chỉ chứa một thể loại.

Khi điều này được thiết lập, thật dễ dàng truy vấn và tìm mọi thứ mà một người nhất định đã làm hoặc mọi thứ mà một người đã làm với tư cách là đạo diễn, hoặc tất cả những người đã từng đạo diễn một bộ phim hoặc tất cả những người có liên quan đến một bộ phim cụ thể .. Nó có thể tiếp tục và tiếp tục.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java ZonedDateTime lưu trong Cơ sở dữ liệu

  2. Làm thế nào để lưu trữ tên tệp trong cơ sở dữ liệu, với các thông tin khác trong khi tải hình ảnh lên máy chủ bằng PHP?

  3. Mysqli không cho phép nhiều truy vấn?

  4. Cấp quyền cho bảng và cột MySQL

  5. Ẩn ID đối tượng cơ sở dữ liệu thực trong url