Bất cứ giải pháp nào tốt nhất đều phụ thuộc IMHO vào nhiều hơn chỉ là bảng, nhưng cũng làm thế nào điều này được sử dụng ở nơi khác trong ứng dụng.
Giả sử rằng các nhận xét đều được liên kết với một số đối tượng khác, giả sử bạn trích xuất tất cả các nhận xét từ đối tượng đó. Trong thiết kế được đề xuất của bạn, việc giải nén tất cả các bình luận chỉ cần chọn từ một bảng, đó là hiệu quả. Nhưng đó là trích xuất các nhận xét mà không cần trích xuất thông tin về áp phích của từng nhận xét. Có lẽ bạn không muốn hiển thị nó, hoặc có thể chúng đã được lưu trữ trong bộ nhớ.
Nhưng điều gì sẽ xảy ra nếu bạn phải truy xuất thông tin về người đăng khi truy xuất nhận xét? Sau đó, bạn phải tham gia với hai bảng khác nhau, và bây giờ tập hợp kết quả thu được ô nhiễm với rất nhiều giá trị NULL (cho một bình luận hồ sơ, tất cả các trường người dùng sẽ là NULL). Mã mà phải phân tích cú pháp tập kết quả này cũng có thể phức tạp hơn.
Cá nhân, tôi có lẽ sẽ bắt đầu với phiên bản hoàn toàn bình thường, và sau đó denormalize khi tôi bắt đầu thấy vấn đề hiệu suất
Ngoài ra còn có một giải pháp hoàn toàn khác nhau có thể cho vấn đề, nhưng điều này phụ thuộc vào việc hay không nó làm ý nghĩa trong miền. Điều gì xảy ra nếu có những nơi khác trong ứng dụng mà người dùng và người đăng có thể được sử dụng thay thế cho nhau? Điều gì sẽ xảy ra nếu Người dùng chỉ là một loại Hồ sơ đặc biệt? Sau đó, tôi nghĩ rằng giải pháp nên được giải quyết thường trong bảng người dùng/hồ sơ.Ví dụ: (một số pseudo-sql viết tắt):
create table AbstractProfile (ID primary key, type) -- type can be 'user' or 'profile'
create table User(ProfileID primary key references AbstractProfile , ...)
create table Profile(ProfileID primary key references AbstractProfile , ...)
Sau đó, bất kỳ nơi nào trong ứng dụng của bạn có thể được sử dụng thay thế cho nhau, bạn có thể tham chiếu ID đăng nhập.
+ 1 cho kỹ thuật chuẩn hóa đúng cách – DancesWithBamboo
Tôi thích giải pháp này nhưng thực hiện lọc đơn giản các nhận xét của người nhận xét hoặc loại người nhận xét sẽ yêu cầu tham gia. – cherouvim
Thật vậy - nhưng sự tham gia là một nhược điểm nhỏ và luôn có thể tạo một Thủ tục xem hoặc lưu trữ để bạn không phải suy nghĩ về việc tham gia mỗi khi bạn cần lấy dữ liệu đó. – becquerel