5

Hãy tưởng tượng lược đồ như vậy.Phím tắt ngoài trong bảng

NOTE TABLE:   NoteID, Note, DetailedTaskID, ..... 

DETAILED TASK TABLE: DetailedTaskID, WorkOrderID, ..... 

WORKORDER TABLE:  WorkOrderID, ProjectID, ..... 

PROJECT TABLE:   ProjectID, ..... 

Bây giờ với lược đồ này cho phép tôi muốn truy xuất tất cả các ghi chú được liên kết với một dự án cụ thể, tôi kết thúc với khá nhiều lần tham gia.

IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project 

Vì vậy, câu hỏi của tôi là khi nào (nếu bao giờ) thích hợp để thêm cột "lối tắt" cho bảng (trong trường hợp này là ProjectID)?

Vì vậy, về cơ bản thay đổi bảng ghi chú này: NoteID, Note, DetailedTaskID, ProjectID

Trả lời

7

Câu trả lời ngắn gọn: Chưa bao giờ, bao giờ hết. câu trả lời

dài: Chỉ khi nào:

  1. Bạn đã xác định rằng việc thực hiện các câu lệnh JOIN là không thể chấp nhận (đó là hiếm khi đúng).

  2. Bạn đã thực sự cạn kiệt tất cả các lựa chọn thay thế ít nguy hiểm hơn.

  3. Bạn đang sẵn sàng để hấp thụ các việc làm thêm liên quan đến việc giữ gìn, thông tin de-bình thường hóa dư thừa trong sync

  4. Bạn sẵn sàng chấp nhận thực tế là nó sau đó trở thành kỹ thuật có thể cho cơ sở dữ liệu của bạn để đưa ra kết quả không chính xác nếu bạn không thể giữ mọi thứ được đồng bộ hóa.

+0

Tôi có thể xác nhận không? Khi bạn nói "ít nguy hiểm" tôi cho rằng bạn có nghĩa là một kịch bản mà một lỗi có thể gây ra một khóa ngoại để trỏ đến một dự án và một trỏ đến một dự án khác, đúng không? –

+0

Chỉ cần như vậy. Trong trường hợp này, một sự giám sát trong mã của bạn (hoặc mã của người khác, được thêm vào sau) có thể cập nhật các khoá ngoại trong một bảng chứ không phải bảng khác. Hoặc, nó có thể chỉ cập nhật một số giá trị khóa ngoài được chuẩn hóa trong các hàng trong bảng thứ hai, nhưng không cập nhật các giá trị khác. Hoặc nó có thể cập nhật quá nhiều hàng trong bảng thứ hai. Và bạn có thể không thấy các lỗi này ngay lập tức, hoặc nhất quán, nếu đôi khi bạn nhận được các giá trị khóa ngoài từ bảng bình thường hóa và đôi khi từ bảng không chuẩn hóa. Nó có thể được thực hiện, nhưng chắc chắn rằng bạn có một nhu cầu thực sự để làm điều đó đầu tiên. –

+0

Cảm ơn rất nhiều về đầu vào của bạn ... –

1

bạn đang nói về cái gì được gọi là một mối quan hệ chính nước ngoài. Đó là cơ sở cho Data Normalization. Tóm lại, bạn sẽ thêm một mối quan hệ khóa ngoại (ProjectID) vào bảng Ghi chú của bạn nếu một Lưu ý (tức là NoteID) thuộc về một Dự án.

Những lợi ích của việc này là để bạn có thể truy vấn dữ liệu quan hệ này, như thế này:

select 
    Note.*, 
    Project.* 
from Note 
left join Project 
on Note.ProjectId = Project.ProjectId 

Đó truy vấn sẽ mang lại tất cả các ghi chú, và dữ liệu dự án (nếu nó là một phần của một dự án) đó là liên quan đến nó.