Mã định danh duy nhất toàn cầu / phổ quát phù hợp cho cơ sở dữ liệu PostGIS là gì?


12

Tôi đã đọc được rằng sử dụng OID làm khóa chính trong db postgreSQL / PostGIS là cách thực hành kém vì có những trường hợp có thể đặt lại chúng. Nghe có vẻ hợp lý, nhưng sau đó một sự thay thế phù hợp là gì? Tôi tin rằng có một tùy chọn để sử dụng UUID "Nhận dạng duy nhất phổ quát", nhưng giá trị văn bản và số lớn xuất hiện là rất kinh khủng.

Chỉ cần thêm một chút nền tảng cho tình huống của tôi. Tôi có tất cả các bảng không gian của mình được tạo bằng một trường có tên là "gid", đây là khóa chính cho bảng đó và chỉ duy nhất cho bảng đó. Bây giờ tôi có một vấn đề vì tôi muốn liên kết các bảng không gian của mình (tất cả đều có trường "gid" bắt đầu từ 1 và tăng dần) với một bảng lớn có thông tin liên quan. Rõ ràng để mối quan hệ của tôi hoạt động, tất cả các tính năng không gian của tôi cần một mã định danh duy nhất phân biệt chúng với nhau.

EDITED Đã thêm hình ảnh này theo nhận xét của Peters. Peter đây là ý tưởng tôi có trong đầu, nó có thể không phải là cách tốt nhất để thực hiện nó hoặc nó thậm chí có thể không phải là thiết kế db tốt. Tôi quan tâm đến những gì bạn nghĩ.

Sơ đồ khái niệm

Lời khuyên nào?


2
"Tôi đã đọc" ... bạn có thể cung cấp một liên kết?
Kirk Kuykendall

1
Đây là một trong nhiều postgresql.org/docs/8.4/static/ddl-system-columns.html về phía dưới cùng của trang, nó đề cập đến việc cho rằng chúng là duy nhất. Ngoài ra liên kết tiếp theo này byte.com/topic/postgresql/answers/423281-oid-not-oid trả lời bài đăng gốc đề cập rằng OID không được dùng cho bảng người dùng.
Ando

1
Bạn có thể thêm một vài chi tiết cụ thể về loại lược đồ bạn đang cố gắng tạo. Tôi không rõ ràng rằng bạn nhất thiết cần một ID duy nhất toàn cầu nếu bạn thay đổi các mối quan hệ khóa ngoại một chút, chẳng hạn.
Peter Eisentraut

1
I believe there is an option to use a "Universal Unique Identifer" UUID, but the large text and number value that spits out is horrible. Tại sao nó không quan trọng ID duy nhất trông như thế nào?
nmtoken

"... nhưng giá trị văn bản và số lớn phun ra thật kinh khủng." Không, không phải vậy. Nó chỉ dài, theo yêu cầu của bất kỳ số ID duy nhất trên toàn cầu .
jpmc26

Câu trả lời:


5

Tôi sẽ tạo ra bảng trung gian riêng biệt buildings_attach, parcels_attachvv Sau đó, bạn không cần một định danh toàn cầu.


Xin chào Peter, Cảm ơn bạn đã phản hồi. Cuối cùng tôi cũng đã liên lạc được với DBA của chúng tôi (cô ấy có trụ sở tại một văn phòng khác), cô ấy đề xuất giải pháp tương tự như bạn đã làm. Tôi rất vui khi đi theo con đường đó vì tôi chắc chắn không phải là người DB (có thể rõ ràng từ bản vẽ lược đồ của tôi?!?), Nhưng đó có thực sự là giải pháp tốt nhất? Điều gì xảy ra nếu có một tệp đính kèm có liên quan đến cả tính năng Parcel và tính năng xây dựng? Trong sơ đồ trên của tôi, tôi chỉ cần nhập chi tiết cho tệp đính kèm một lần, trong đó như giải pháp mà DBA đề xuất tôi sẽ cần thực hiện hai lần trong hai bảng khác nhau.
Ando

1
Có, nhưng chúng là hai mẩu thông tin riêng biệt, vì vậy bạn có thể nhập chúng ở hai nơi riêng biệt. Đó chỉ là cách một thiết kế cơ sở dữ liệu quan hệ hoạt động.
Peter Eisentraut

Cảm ơn sự giúp đỡ của Peter, tôi đánh giá cao sự làm rõ! Tôi sẽ đi xuống tuyến đường đó. Chúc mừng
Ando

9

Hai giải pháp:

1) Tạo một chuỗi duy nhất và làm cho tất cả các bảng sử dụng chuỗi đó, có thể được thực hiện ngay từ đầu hoặc bạn có thể tạo một cột ID và cập nhật các bảng của mình ngay bây giờ.

Để tạo chuỗi:

CREATE SEQUENCE universal_sequence;

Sau đó, một bảng:

CREATE TABLE (
colname integer NOT NULL DEFAULT nextval('universal_sequence'));

Để cập nhật trường id bảng hiện có với ID mới (thực hiện cho tất cả các bảng mà bạn muốn theo cùng một chuỗi):

UPDATE table1
SET id=nextval('universal_sequence'));

2) Giải pháp khác: Tạo một chuỗi tạm thời và chúng chạy truy vấn tạo cột ID mới.

Xem thêm tại đây: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html


4

Tùy chọn tốt nhất là UUID hoặc GUID. Chúng được xây dựng vì lý do này, duy nhất trên toàn cầu cho dù là bảng nào. Xấu xí? Có nhưng họ là tốt nhất cho tình huống này.

Xem /programming/294933/generate-unique-id-to-share-with-multipl-tables-sql-2008

Tôi đã thấy các phương thức mà mọi người sử dụng dữ liệu từ bảng để tạo ID, ví dụ như col1 + somestring + col2, tôi thực sự sẽ thực sự thích thú với điều này (xem tại đây ). ID thông minh là một ý tưởng thực sự tồi tệ.


0

Ê

Tại sao bạn không lấy id từ bàn lớn và đặt vào các bảng không gian thay thế?

Nếu một hàng trong một trong các bảng không gian liên quan đến nhiều hàng trong bảng lớn tôi thấy có vấn đề, nếu không thì id bảng lớn là đủ hoặc tôi đang thiếu thứ gì đó.

/ Nicklas


Xin chào Nicklas, tôi không thể làm theo cách đó vì một trong những tính năng không gian của tôi có thể liên quan đến 1 hoặc nhiều bản ghi trong bảng lớn hơn
Ando
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.