2015-10-19 19 views
5

Giả sử bạn đang viết một ứng dụng trong OCaml/F #/SML/Haskell và muốn lưu dữ liệu trong cơ sở dữ liệu quan hệ. Nó rất dễ dàng để ánh xạ các loại sản phẩm (bản ghi và bộ dữ liệu) cho các quan hệ, nhưng làm thế nào để bạn ánh xạ các kiểu biến thể cho các quan hệ?Mô hình hóa các kiểu dữ liệu đại số sử dụng cơ sở dữ liệu quan hệ

Để cụ thể, bạn sẽ tồn tại một loại như sau, trong cơ sở dữ liệu quan hệ như thế nào?

(* OCaml *) 
type t = 
    | Foo 
    | Bar of string 
    | Baz of int * int * int 
+0

Bạn có thể đưa ra ví dụ về dữ liệu thực mà bạn có thể muốn lưu trữ không? – Shnugo

+0

Ý tưởng đầu tiên của tôi sẽ là XML. Bạn có thể lưu trữ bất kỳ loại dữ liệu có cấu trúc hình ảnh nào cùng với dữ liệu meta mô tả (thuộc tính). Nhưng bạn sẽ cần logic cao để giải thích điều này ... – Shnugo

+0

@shnugo Như tôi đề cập đến tôi quan tâm đến cơ sở dữ liệu quan hệ. – Halst

Trả lời

2

Có vẻ như tẻ nhạt nhưng tôi sẽ tạo bảng cho mỗi sản phẩm trong tổng.

CREATE TABLE foo (id uuid PRIMARY KEY); 

CREATE TABLE bar (id uuid PRIMARY KEY, 
        s text NOT NULL); 

CREATE TABLE baz (id uuid PRIMARY KEY, 
        a integer NOT NULL, 
        b integer NOT NULL, 
        c integer NOT NULL); 

Bạn có thể muốn lưu trữ một số siêu dữ liệu cùng với hồ sơ của từng loại:

CREATE TABLE envelope (id uuid PRIMARY KEY, 
         t timestamptz NOT NULL DEFAULT now(), 
         by text NOT NULL DEFAULT sessions_user); 

Và điều này cho thấy một ràng buộc khoá ngoại:

CREATE TABLE foo (id uuid PRIMARY KEY REFERENCES envelope); 

CREATE TABLE bar (id uuid PRIMARY KEY REFERENCES envelope, 
        s text NOT NULL); 

CREATE TABLE baz (id uuid PRIMARY KEY REFERENCES envelope, 
        a integer NOT NULL, 
        b integer NOT NULL, 
        c integer NOT NULL); 

Và nếu bạn thậm chí còn nghiêm ngặt hơn bạn có thể tưởng tượng việc lưu trữ một cột ty với tên của loại và sử dụng nó để tạo một khóa ngoài tổng hợp. (Như được mô tả dưới "Where Not to Use Table Inheritance" trong blog LedgerSMB.)

+0

Gần đây tôi đã nghĩ nhiều hơn về điều này và có một kế hoạch liên quan đến một bảng trung gian để phục vụ như một mục tiêu quan trọng của nước ngoài. Một số mã ví dụ có thể được tìm thấy ở đây: https://github.com/solidsnack/pg-sql-variants – solidsnack

+0

Làm cách nào để lưu trữ tham chiếu đến 't'? – nafg

+0

Lưu một tham chiếu đến phong bì. – solidsnack

Các vấn đề liên quan