Tôi có rất nhiều "thứ" khác nhau (một lĩnh vực cụ thể mục/tổ chức/đối tượng) mà có thể nhìn thấy những "điều" chủ sở hữu (con người). Chủ sở hữu sẽ xác định "thứ" của họ với một số. Thay vào đó cho thấy một số "ngẫu nhiên" lớn, tôi muốn chỉ cho họ một số nhỏ (tốt hơn là một chuỗi bắt đầu từ 1) dễ dàng hơn cho con người. Các chủ sở hữu rất thoải mái khi nói về "foo 37 của tôi" và "thanh của cô ấy 128". Có "trình tự" có thể có những khoảng trống nhưng số lượng kèm theo phải giữ nguyên trong suốt thời gian tồn tại của "sự cố". Vì vậy, tôi cần một cách để tạo ra "điều" + id chủ sở hữu cụ thể (hiện được gọi là "id hiển thị").
Số lượng "điều" + kết hợp chủ sở hữu là về quy mô của 10k +. Hiện tại "những thứ" mới không thể được tạo động nhưng chủ sở hữu có thể.
Số một "điều" các trường hợp mỗi chủ sở hữu là một tương đối nhỏ, khoảng chục mỗi chủ sở hữu, nhưng không có nắp cứng có thể được bắt nguồn từ các quy tắc kinh doanh. Trường hợp "điều" mới được tạo và xóa thường xuyên.
tùy chọn coi
Tôi tìm thấy một cuộc thảo luận tốt trong một SO câu hỏi Oracle Partitioned Sequence nhằm giải quyết khá nhiều vấn đề tương tự tôi có.
Cho đến nay tôi đã xem xét các tùy chọn sau:
- Tôi nghĩ rằng một chuỗi cơ sở dữ liệu tiêu chuẩn sẽ là một hoàn toàn tốt đẹp nhưng điều đó sẽ yêu cầu tôi để tự động tạo ra một số lượng lớn các "điều" trình tự cụ thể + chủ sở hữu và cũng giải quyết tên trình tự trong quá trình chèn. (Và thả các chuỗi khi chủ sở hữu đã biến mất.) Tôi không chắc chắn nếu tạo một số lượng lớn các chuỗi là một thực hành tốt ở tất cả (đối với tôi 10k + đối tượng cơ sở dữ liệu là một số lượng lớn).
- Tôi cũng coi khét tiếng
max(visible_id) + 1
nhưng chúng tôi sẽ chạy vào các vấn đề đồng thời bình thường với điều đó, vì vậy đó là một không-go. - Không lưu id chủ sở hữu cụ thể vào cơ sở dữ liệu ở tất cả nhưng thay vì tạo ra nó trong các lựa chọn như suggested bởi Adam Musch. Đây là một ý tưởng tuyệt vời nhưng tiếc là id cần phải giống nhau trong suốt cuộc đời "điều".
- Tránh toàn bộ vấn đề bằng cách cho phép các chủ sở hữu tên "điều". Nhưng họ không thích ý tưởng gì cả - "Tại sao tôi nên bận tâm, thật dễ dàng để nói foo 16."!
Câu hỏi
Có một số cách khác để giải quyết vấn đề này hay tôi nên bắt đầu tạo các chuỗi động? Nếu các chuỗi là câu trả lời, hãy giải thích những gì có thể xảy ra (giống như các cam kết ngầm định trong DDL).
Tôi quan tâm đến cả hai Oracle 11gR2 và 12c giải pháp (nếu họ là khác nhau).
Pseudo-code để minh họa cho câu hỏi
create table foo (
id number primary key -- the key for computers
,owner_id number
,visible_id number -- the key for humans
,data_ varchar2(20)
);
create constraint foo_u1 unique foo(owner_id, visible_id);
-- primary key sequence
create sequence foo_id_seq;
insert into foo values(
foo_id_seq.nextval
,1
,1 -- what to put here ?
,'lorem ipsum'
);
insert into foo values(
foo_id_seq.nextval
,2
,1 -- what to put here ?
,'dolor sit amet'
);
select visible_id, data_ from foo where owner = 2 order by visible_id;
Tại sao tùy chọn 3 không áp dụng? Các trường hợp nào có thể bị xóa? Điều gì sẽ xảy ra nếu đánh dấu chúng là đã xóa (thông qua cột bổ sung chẳng hạn)? –
Tôi không hiểu tại sao # 2 sẽ tạo ra các vấn đề tương tranh khi MAX (visible_id) bị ràng buộc với một chủ sở hữu cụ thể (bạn chắc chắn không muốn tối đa toàn bộ bảng). Có khả năng chủ sở hữu sẽ cập nhật các mặt hàng của họ tại cùng một thời điểm chính xác từ hơn một phiên bản ứng dụng? Có vẻ như bạn cần một khóa chính trên bàn, chủ nhân, thingid. Thingid sẽ phải được tạo ra bởi bạn vì vậy tôi sẽ đề nghị sử dụng một thủ tục lưu trữ để cập nhật/chèn/xóa để bạn có thể quản lý trình tự tuy nhiên bạn muốn thay vì gọi dml hoạt động trực tiếp – Matt
@KonstantinSorokin Vâng ... bởi vì, err ... Tôi có thể đơn giản là tôi bị mù vì lựa chọn đó. Có, tôi biết [xóa mềm] (http://stackoverflow.com/q/2549839/272735) và ý tưởng đầu tiên của tôi là có thể phù hợp ở đây. Tôi cần phải suy nghĩ nhiều hơn về ý tưởng này và những lợi ích và hạn chế. – user272735