Khóa chính trên bảng tạm thời là gì?


7

Nếu tôi sử dụng thiết kế bảng sau để ghi lại lịch sử ...:

CREATE TABLE MyTable (
    insertion_timestamp TIMESTAMP,
    deleted_flag BOOLEAN,
    natural_key INT,
    attribute VARCHAR
);

... Vậy khóa chính phải là gì?

(Cơ chế lịch sử là INSERT-only: các hàng cập nhật được chèn bằng một hàng khác insertion_timestampvà các hàng đã xóa được chèn bằng dấu thời gian khác và được deleted_flagđặt thành true.)

Tôi đang suy nghĩ PRIMARY KEY (insertion_timestamp, deleted_flag, natural_key), nhưng lý do duy nhất deleted_flagđể đưa vào là tính đến khả năng một hàng được chèn và sau đó (mềm) bị xóa ngay lập tức, sớm hơn dấu tích tiếp theo của mức độ chi tiết của TIMESTAMPloại dữ liệu. Cảm giác này quá hoang tưởng ...


1
Tôi không thích các tên cột hậu tố (hoặc tiền tố) với các kiểu dữ liệu của chúng. Tôi nghĩ rằng tôi thích insertedAt, isActive( !deleted_flag).
Clockwork-Muse

Điểm công bằng cả.
jl6

Câu trả lời:


3

Tôi đang suy nghĩ PRIMARY KEY (insertion_timestamp, deleted_flag, natural_key), nhưng lý do duy nhất để bao gồm remove_flag là tính đến khả năng một hàng được chèn và sau đó (mềm) bị xóa ngay lập tức, sớm hơn dấu tích tiếp theo của mức độ chi tiết của TIMESTAMPloại dữ liệu. Cảm giác này quá hoang tưởng ...

Tôi không biết liệu nó có quá hoang tưởng hay không, nhưng thật hợp lý khi chỉ quy định rằng không có hai hàng nào có thể chia sẻ giống nhau insertion_timestampnatural_key, và trách nhiệm của các khách hàng thực hiện chèn để xử lý trường hợp cạnh. Nó đơn giản hóa việc sử dụng bảng một cách đáng kể nếu bạn có thể giả sử rằng các kết hợp đó là một cộng duy nhất trong khóa ba bên mà bạn đề xuất, thật khó để sắp xếp các hàng trong trường hợp ba lần trong đó có hai lần xóa "mềm" ngay lập tức.

Vì vậy, đề xuất của tôi sẽ là PRIMARY KEY (natural_key, insertion_timestamp)(theo thứ tự đó nhưng tôi đoán natural_keylà sẽ được truy vấn thường xuyên hơn, điều này có thể sai).

Ngoài ra, bạn nên nghiêm túc xem xét các bổ sung sau:

  1. Thêm một inactive_timestampcột vào các bảng. Điều này cho phép bạn truy vấn các hàng đã hoạt động tại một thời điểm.
  2. Hãy suy nghĩ cẩn thận về ý nghĩa của dấu thời gian. Bảng có phải đại diện cho lịch sử của các giá trị trong thế giới thực ("số điện thoại của Joe là 555-5555 cho đến ngày 22 tháng 1, sau đó là 666-6666 từ ngày 22 tháng 1") hay lịch sử sửa đổi thành giá trị "vĩnh cửu"? Lược đồ của bạn trông giống như sau này, nhưng hãy chắc chắn rằng bạn hiểu cái nào sẽ cần thiết.

Cảm ơn câu trả lời của bạn. 1. Điều đó sẽ làm cho truy vấn đơn giản hơn và có thể nhanh hơn nhưng tôi chỉ đang cố gắng bình thường hóa hoàn toàn mô hình vào lúc này. 2. Tôi biết các phương pháp bitemporal; ví dụ của tôi là trường hợp đơn giản nhất. 3. Bạn có thể giải thích về vấn đề đặt hàng mà bạn đề cập đến trong trường hợp mắc bệnh hoang tưởng không?
jl6

3

Trong nhiều ứng dụng, thông thường sử dụng số được tạo tự động db như số thứ tự là PK. Nếu bảng không có khóa tự nhiên và bạn không muốn sử dụng khóa nhân tạo (như tôi đã đề xuất) và bảng không phải là bảng cha, bạn hoàn toàn không phải tạo PK (bạn vẫn có thể tạo các chỉ mục không duy nhất trên bất kỳ tổ hợp cột nào bạn muốn).

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.