Bạn luôn nên bắt đầu bằng cách thiết kế các bảng của mình ở dạng bình thường thứ ba (3NF). Hoàn nguyên về các dạng thấp hơn (vì lý do hiệu suất thường là vì lý do hiệu suất) hoàn toàn có thể chấp nhận được với điều kiện bạn hiểu và giảm thiểu tác động, nhưng bắt đầu với 3NF.
Quy tắc (đơn giản hơn một chút) cần nhớ là mọi cột không phải khóa trong bảng phải phụ thuộc vào:
- chìa khóa,
- toàn bộ khóa,
- và không có gì khác ngoài chìa khóa,
- "vậy hãy giúp tôi, Codd" - một chút hài hước của DBA (và ý tôi là "nhỏ").
Câu hỏi đầu tiên khá đơn giản.
Mối quan hệ một-nhiều được thể hiện tốt nhất dưới dạng khóa ngoại trong bảng "nhiều". Vì vậy, những gì bạn đề xuất là hợp lý. Nó cho phép bạn hạn chế mối quan hệ một cách tự động. Nếu bạn có một bảng tham gia riêng biệt (được sử dụng cho nhiều-nhiều), bạn sẽ cần dùng đến "thủ thuật" để thực thi mối quan hệ một-nhiều.
Đối với câu hỏi thứ hai của bạn, bạn cần phải xem quy tắc "Codd" ở trên và tự nghĩ:chính xác thì những hàng này trong mỗi bảng đại diện cho điều gì? Nếu một hành động hạng mục công việc là một đối tượng khác biệt với một hạng mục công việc (chúng có thể có liên quan nhưng, nếu chúng không đại diện cho cùng một đối tượng, chúng khác nhau), chúng phải nằm trong các bảng khác nhau.
Ngoài ra, có vẻ như bạn có mối quan hệ một-nhiều ở đó (một mục có thể có nhiều hành động) vì vậy chúng phải nằm trong các bảng khác nhau chỉ vì lý do đó.
Đối với truy vấn của bạn về thông tin thừa:nếu chúng thực sự là thừa, chúng nên được sửa chữa.
Sử dụng step_num
như một ví dụ, điều này chính xác đại diện cho điều gì? Nếu đó là một thuộc tính của tác phẩm item, nó không nên có trong tác phẩm hành động bàn ở tất cả.
Bạn sẽ loại bỏ nó từ đó và nếu bạn muốn biết số bước cho một hàng trong bảng hành động công việc, bạn sẽ kết hợp với bảng mục công việc bằng cách sử dụng khóa ngoại.
Thay vào đó, nếu nó là một thuộc tính của hành động công việc, bạn nên xóa nó khỏi bảng mục công việc vì nó không có ý nghĩa gì. Bạn có thể có hai hành động, mỗi hành động có một số bước khác nhau, vậy số bước của mục mẹ sẽ là bao nhiêu trong trường hợp đó?
Tất nhiên, bạn có thể có khác biệt số bước cho cả hai mục và hành động - trong trường hợp đó, tôi sẽ cân nhắc đổi tên để làm rõ ý định, chẳng hạn như item_step_num
và action_step_num
.
Điểm mấu chốt là bắt đầu với 3NF. Nếu một lúc nào đó cơ sở dữ liệu của bạn chạy quá chậm, thì thì xem xét việc đảo ngược sang một hình thức nhỏ hơn. Sau đó, bạn có thể hỏi khác đặt câu hỏi ở đây về cách nhận ra và giảm thiểu các vấn đề nảy sinh từ đó (ví dụ:khả năng dữ liệu không nhất quán ở hai nơi và sử dụng trình kích hoạt để ngăn chặn điều đó).