Thực hành tốt nhất để lưu trữ siêu dữ liệu hồ sơ


10

Cách thực hành tốt nhất để lưu trữ siêu dữ liệu của các bản ghi riêng lẻ trong cơ sở dữ liệu là gì?

Tôi cần lưu trữ dữ liệu meta phổ biến như thời gian tạo và thời gian cập nhật lần cuối cho nhiều bảng trong cơ sở dữ liệu của tôi. Tôi tìm thấy một vài giải pháp khác nhau:

  1. Lưu trữ dữ liệu meta trực tiếp trong các bảng.

    Ưu điểm:

    • Dữ liệu meta được liên kết trực tiếp với hồ sơ
    • Không cần tham gia để truy xuất dữ liệu meta

    Nhược điểm:

    • Rất nhiều cột trùng lặp được yêu cầu (trừ khi sử dụng kế thừa)
    • Dữ liệu meta và dữ liệu kinh doanh không được tách rời
  2. Tạo một bảng dữ liệu meta chung với và sử dụng các khóa ngoại mềm để liên kết dữ liệu với các bảng và bản ghi chính xác.

    Ưu điểm:

    • Không trùng lặp cột
    • Dữ liệu meta được tách ra khỏi dữ liệu kinh doanh

    Nhược điểm:

    • Không có liên kết trực tiếp giữa dữ liệu meta và dữ liệu (không thể sử dụng FK)
    • Tham gia yêu cầu một điều kiện bổ sung
  3. Tạo các bảng dữ liệu meta riêng lẻ cho mỗi bảng yêu cầu dữ liệu meta.

    Ưu điểm:

    • Dữ liệu meta được liên kết trực tiếp với hồ sơ
    • Dữ liệu meta được tách ra khỏi dữ liệu kinh doanh

    Nhược điểm:

    • Rất nhiều bảng phụ được yêu cầu
    • Rất nhiều cột trùng lặp được yêu cầu (trừ khi sử dụng kế thừa)

Có nhiều lựa chọn, ưu hay nhược điểm hơn những cái tôi đã đề cập ở đây không? Và cách tốt nhất để lưu trữ dữ liệu meta này là gì?


Chúng ta đang nói về loại siêu dữ liệu nào? Có lẽ sử dụng một hstorehoặc JSONcột có thể giải quyết vấn đề của bạn?
a_horse_with_no_name

@a_horse_with_no_name - Hiện tại tôi chỉ cần thời gian tạo, thời gian cập nhật và nguồn tạo. Các trường được cố định vì vậy tôi không cần khóa-giá trị như lưu trữ. Tôi chỉ lo lắng về nơi tôi nên lưu trữ dữ liệu.
Tiddo

1
Sau đó, tôi không thấy bất kỳ lý do nào để không thêm ba cột đó vào bảng cơ sở.
a_horse_with_no_name

Câu trả lời:


7

Các cột bạn đang nói đến, chiếm 20 byte (nếu được căn chỉnh mà không có phần đệm):

thời gian tạo, thời gian cập nhật và nguồn tạo

dấu thời gian .. dấu thời gian 8 byte
..
số nguyên 8 byte .. 4 byte

Chỉ tiêu đề và con trỏ mục cho một hàng riêng biệt trong một bảng riêng biệt sẽ chiếm 23 + 1 + 4 = 28 byte cộng với 20 byte dữ liệu thực tế, cộng với 4 byte đệm ở cuối. Làm cho 52 byte mỗi hàng . Đọc thêm tại đây:

Liên quan đến lưu trữ, bạn không có gì để đạt được. Liên quan đến hiệu suất, bạn hầu như không mất bất cứ thứ gì chỉ với 16 - 24 byte mỗi hàng.

Các cột cũng trực tiếp thuộc về hàng, vì vậy nó có ý nghĩa để giữ chúng cùng nhau. Tôi tạo thói quen để thêm chính xác các cột như vậy (cộng với nguồn riêng cho bản cập nhật cuối cùng) vào tất cả các bảng có liên quan.

Nó cũng dễ dàng hơn để viết một TRIGGER ON INSERT OR UPDATEđể giữ cho chúng hiện tại.

Câu chuyện dài: một cuộc bỏ phiếu mạnh mẽ cho lựa chọn của bạn 1 .

Nơi tôi sẽ đến tùy chọn 3 :
Nếu siêu dữ liệu được cập nhật thường xuyên, trong khi hàng lõi thì không. Sau đó, có thể trả tiền để giữ một bảng 1: 1 riêng biệt để làm cho CẬP NHẬT rẻ hơn và giảm sự phình to trên bảng chính - hoặc thậm chí đi đến tùy chọn 2.

Nơi tôi sẽ đến tùy chọn 2 :
Nếu tập hợp các cột siêu dữ liệu có tính lặp lại cao. Bạn có thể có một cột FK cho tập hợp siêu dữ liệu trong (các) bảng chính. Không tiết kiệm nhiều cho ba cột nhỏ như trong ví dụ của bạn.


Điều gì về việc giải quyết vấn đề này với kế thừa bảng, có những hạn chế đáng chú ý so với việc sử dụng các siêu dữ liệu trực tiếp trong bảng không? Tuy nhiên, nếu tôi hiểu chính xác, kế thừa bảng của postgres không tuân thủ tiêu chuẩn SQL, phải không?
devrys 18/07/2015

1
@devrys: Tính kế thừa có một số hạn chế trong Postgres Quan trọng hơn: Tôi không thấy cách thừa kế có thể giải quyết việc lưu một số cột bổ sung trên mỗi hàng. nó sẽ là một tùy chọn nếu bạn có một số hàng và các hàng khác không có siêu dữ liệu. Nhưng tôi sẽ không sử dụng nó cho điều đó.
Erwin Brandstetter
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.