Sự lựa chọn- hoặc ids-list- trường đại diện


7

Tôi tự hỏi đâu là cách tốt nhất để thể hiện cài đặt người dùng có thể lấy giá trị từ một tập hợp (chẳng hạn như 'Cao', 'Trung bình' hoặc 'Thấp') hoặc là danh sách ID từ người khác (hoặc tương tự!) bảng (Quan hệ nhiều đến nhiều).

Tôi muốn biết những gì thường được sử dụng và những hạn chế / tài sản của từng giải pháp (về hiệu suất, tính toàn vẹn và tính bền vững).

Câu trả lời:


3

Ở một mức độ nào đó, bất kỳ giải pháp nào cũng sẽ phụ thuộc rất nhiều vào chính xác những gì bạn đang làm và RDBMS bạn đang sử dụng. Nói chung, mặc dù sử dụng trường văn bản để lưu trữ danh sách các số nguyên được phân tách bằng dấu phẩy là một ý tưởng tồi.

Giải pháp điểm bắt đầu luôn là tham chiếu dựa trên id. Đây là một nơi tốt để bắt đầu vì nó tuân theo các quy tắc quan hệ đúng đắn và nó cho phép bạn xử lý những thứ như nhiều giá trị bằng cách phá vỡ những điều này thành các mối quan hệ mới. Trong thực tế tôi sẽ nói rằng luôn luôn tốt nhất để bắt đầu ở đây.

Tuy nhiên, các lựa chọn thay thế hoạt động tốt trong một số trường hợp và với một số RDBMS. Các trường ENUM (hoặc các miền văn bản thay thế có kiểm tra để giữ chúng trong một số giá trị) rất hữu ích nếu bạn không bao giờ cần bỏ tùy chọn. Nếu bạn làm như vậy, thì bạn phải xác định những gì bạn muốn làm về điều này trước khi bạn bỏ chúng. Các loại mảng thứ hai cũng có thể hữu ích trong một số trường hợp nhất định (và chúng không nhất thiết phải phá vỡ 1NF nếu toàn bộ mảng là giá trị nguyên tử của một miền, ví dụ: nếu chúng ta biểu thị địa chỉ IPv4 dưới dạng một mảng gồm 4 số nguyên 8 bit ). Các cách tiếp cận dựa trên mảng phụ thuộc nhiều vào những gì bạn đang làm và hỗ trợ ở mức db, nhưng trên PostgreQuery, tôi sẽ chọn một mảng trong đó vấn đề về cardinality (nghĩa là một mảng là một tuple thay vì một tập hợp) và trong đó ngữ nghĩa hoàn toàn khép kín .


Vì vậy, để nói một cách ngắn gọn, không có giải pháp chung, nó phụ thuộc rất nhiều vào nhu cầu của một người. Tuy nhiên, giải pháp thứ hai tôi đưa ra có vẻ tốt hơn và có thể mở rộng hơn so với trước đây. Tôi có hiểu rõ không?
Antoine Pinsard

2

Bạn đã không cho chúng tôi làm việc nhiều ở đây, "cái bàn khác" nói về cái gì? Bây giờ hãy giả sử đó là Ưu tiên tùy chỉnh.

Để có thể đặt khóa ngoại trên nhiều loại, bạn cần sử dụng Kế thừa bảng . Sẽ có một bảng chính và cả hai loại "kế thừa" từ nó, sử dụng cùng một trường khóa chính.

Có một vài loại kế thừa bảng. Kế thừa bảng đơn sử dụng null, nhưng đơn giản hơn nhiều. Kế thừa bảng lớp được chuẩn hóa, nhưng là một nỗi đau.

PRIORITY
id
type {generic, custom}


PRIORITY_GENERIC
id pk fk PRIORITY
name


PRIORITY_CUSTOM
id pk fk PRIORITY
name
created_at timestamp


USER
id pk
name
priority_id fk PRIORITY


insert into priority values
(1, 'Generic'),
(2, 'Generic'),
(3, 'Generic'),
(4, 'Custom');


insert into priority_generic values 
(1, 'Low'),
(2, 'Medium'),
(3, 'High');


insert into priority_custom values
(4, 'Crazy Super High', current_timestamp);


insert into user values (1, 'neil', 3);
insert into user values (2, 'chris', 4);

Xin lỗi nếu tôi không làm rõ bản thân mình nhưng tôi không nghĩ dữ liệu được lưu trữ trong bảng khác có vấn đề. Đây có thể là người dùng, sản phẩm hoặc chuối. Điều quan trọng là nếu tôi không có giá trị "chung" hoặc được xác định trước trong trường, giá trị tùy chỉnh là DANH SÁCH các hàng từ bảng khác. Vì vậy, về cơ bản một danh sách ID được phân tách bằng dấu phẩy. Tôi sẽ viết lại câu hỏi của tôi, nó có thể không được diễn đạt tốt.
Antoine Pinsard

đồng ý. lược đồ của tôi vẫn sẽ làm việc cho bạn. bạn không muốn lưu trữ danh sách csv trong một cột.
Neil McGuigan

Trên thực tế tôi không thể thấy cách kế thừa bảng giải quyết vấn đề. Tôi đã chỉnh sửa câu hỏi của tôi. Có lẽ nó sẽ loại bỏ bất kỳ sự hiểu lầm?
Antoine Pinsard

vì vậy cài đặt người dùng này có thể trỏ đến bất kỳ bảng nào trong cơ sở dữ liệu của bạn?
Neil McGuigan

Không, nó trỏ đến một bảng cụ thể được biết đến. Câu hỏi của tôi khá chung chung, nó không dành cho một dự án cụ thể. Nhưng nếu nó rõ ràng hơn đối với bạn, chỉ cần giả sử nó trỏ đến bảng Người dùng (điều này hợp lý nếu người dùng muốn cấp quyền truy cập vào trang hồ sơ của mình cho "Mọi người", "Bạn bè", "Không ai" hoặc một nhóm người dùng cụ thể chẳng hạn ).
Antoine Pinsard

-1

Giải pháp "cột ghép XOR"

Giải pháp này bao gồm hai cột hoạt động cùng nhau:

  • Một ký tự không thể thay đổi cột "ENUM" có thể đánh giá "Cao", "Trung bình" hoặc "Thấp".
  • Một cột ảo thực sự sẽ được biểu thị bằng bảng thứ ba tạo mối quan hệ giữa bảng người dùng và bảng nước ngoài. Cũng giống như làm một mối quan hệ Nhiều-Nhiều-cổ điển.

Nếu cái trước có giá trị "Cao", "Trung bình" hoặc "Thấp", ứng dụng sẽ chỉ lấy giá trị này và cái sau sẽ bị bỏ qua. Mặt khác, nếu là NULL, mối quan hệ M2M sẽ được sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.