2008-11-05 24 views
21

Để tốt hơn hoặc tệ hơn, chúng tôi có một giải pháp dựa trên nhiều cơ sở dữ liệu mà tất cả đều tham chiếu cơ sở dữ liệu quản trị chung. Cơ sở dữ liệu đóng vai trò như một phần của mô-đun, và không phải tất cả các mô-đun đều được yêu cầu để cài đặt (có thể là lý do tại sao chúng tôi có nhiều cơ sở dữ liệu ở vị trí đầu tiên). Cơ sở dữ liệu quản trị là bắt buộc, tuy nhiên ... vì vậy nó sẽ luôn luôn ở đó.Thiết kế SQL xung quanh thiếu tham chiếu khóa ngoài cơ sở dữ liệu chéo

Tôi muốn mang lại một số tính toàn vẹn tham chiếu và thứ tự đến sự hỗn loạn, nhưng tôi bị cản trở bởi sự không có khả năng của máy chủ SQL để thực hiện các khóa ngoại chéo cơ sở dữ liệu. Không có nhiều sự khuấy động trong cơ sở dữ liệu, nhưng thông tin sẽ được chèn vào/cập nhật bởi (ahem) người dùng phi kỹ thuật.

sự lựa chọn của tôi khi tôi nhìn thấy chúng là:

a) Phạt chìa khóa giả nước ngoài sử dụng trigger (ok, nhưng một chút công việc)

b) Sử dụng gây nên sao chép từ quản trị cơ sở dữ liệu khác (một công thức rõ ràng đối với thảm họa)

c) Phạt khóa ngoại psuedo trong mã/Dal (không chơi tốt với ORM)

d) Đừng lo lắng về điều đó ở cấp DB, sử dụng thiết kế giao diện người dùng tốt để đảm bảo không ai làm bất cứ điều gì ngu ngốc và hạn chế truy cập/giữ hơi thở o n truy cập SQL trực tiếp.

Thẳng thắn mà nói, tôi nghiêng để đi với "D", nhưng figured tôi muốn đi ra ngoài lấy ý kiến ​​thông minh hơn tôi ...

Trả lời

4

Chúng tôi có vấn đề chính xác cùng và khá thẳng thắn, nó sucks. Giải pháp duy nhất của chúng tôi mà chúng tôi thấy hiệu quả là tùy chọn D và sử dụng lớp kinh doanh để cố gắng giữ cho mọi thứ được đồng bộ hóa (bao gồm trong giao dịch, v.v.)

4

Giả sử mỗi mô-đun được thiết lập sao cho nó được liên kết với cơ sở dữ liệu quản trị, bạn có thể có thể đơn giản hóa điều này bằng cách thiết lập các khung nhìn cho các bảng quản trị trong mỗi cơ sở dữ liệu mô-đun.

+2

Chúng tôi đã nghĩ về điều này, và nó giúp phần nào. Vấn đề vẫn còn, tuy nhiên, bạn không thể treo một khóa ngoài khỏi một khung nhìn trong máy chủ SQL. Mặc dù vậy, suy nghĩ tốt. – brmore

+0

Sử dụng chế độ xem theo cách này sẽ cung cấp cho bạn thứ gì đó để chọn trong một khóa nước ngoài được kích hoạt bằng trình kích hoạt, giúp dễ dàng hơn. –

1

Tùy thuộc vào việc triển khai cơ sở dữ liệu của bạn, thường bạn sẽ có thể liên kết các bảng từ cơ sở dữ liệu khác (AdminDB) và chúng xuất hiện trong các cơ sở dữ liệu mô-đun khác nhau của bạn.

Trong Microsoft Access bạn có thể liên kết bảng bằng cách bấm chuột phải, và sau đó chọn nguồn dữ liệu ODBC. Trong Oracle they call it a database link. Tôi sẵn sàng đặt cược SQLServer has some form of this implementation thiếu triển khai sao chép tùy chỉnh trên một bảng.

Khi bạn liên kết trong bảng quản trị viên nước ngoài với cơ sở dữ liệu mô-đun của bạn (hoặc ngược lại), thì bạn có thể xác định các ràng buộc như thể các bảng nằm trong cùng một lược đồ.

Tùy chọn thứ hai thậm chí có thể đơn giản hơn. Điều gì sẽ xảy ra nếu bạn sử dụng cùng một lược đồ cho tất cả các mô-đun và cơ sở dữ liệu quản trị? Bạn biết cơ sở dữ liệu quản trị là hiện tại, vì vậy chỉ cần chạy kịch bản tạo bảng đối với lược đồ đó. Miễn là không có bảng/xem/thủ tục lưu trữ đặt tên xung đột, sau đó nó nên tất cả chỉ làm việc bằng cách thay đổi dblogin trong tất cả các mô-đun để phù hợp.

3

Chúng tôi có tính mô đun như vậy trong các sản phẩm của mình, nhưng các yêu cầu cơ sở dữ liệu của chúng tôi được hợp nhất với nhau trong khi cài đặt. Ví dụ gói quản trị và sản phẩm A của chúng tôi có thể là mua ban đầu bởi một khách hàng nơi họ cài đặt hai mô-đun vào cơ sở dữ liệu X. Nếu sau này họ mua sản phẩm B, thành phần cơ sở dữ liệu được xếp lớp ngay trên cơ sở dữ liệu X thêm vào DRI khi cần thiết.Trường hợp duy nhất tôi thấy nhu cầu về cơ sở dữ liệu riêng biệt từ góc độ thiết kế là khi bạn vẽ một đường cứng giữa các đơn vị kinh doanh (chẳng hạn như một công ty) tại thời điểm đó vấn đề thực sự là một loại phân vùng. Great Plains Dynamics thực hiện điều này, nơi họ có một cơ sở dữ liệu quản trị duy nhất và nhiều cơ sở dữ liệu công ty. Tuy nhiên, mỗi mô-đun trong GP cho một công ty nhất định cư trú trong cơ sở dữ liệu duy nhất đó.

Tất nhiên nếu bạn bị kẹt với các cơ sở dữ liệu riêng biệt, tôi đồng ý rằng D là lựa chọn tốt nhất.

1

Tôi đoán nó phụ thuộc vào mức độ nghiêm trọng của ứng dụng của bạn. Bạn có muốn tiếp tục, trong một thời trang có thể giới hạn, để hoạt động nếu cơ sở dữ liệu quản trị đó đi xuống. Nếu bạn nói, không có cách nào, nếu quản trị viên ngừng hoạt động, toàn bộ ứng dụng sẽ bị tạm dừng ngay lập tức so với tất cả những gì được nói cho đến thời điểm này là tốt.

Nếu bạn nói, "gee, có rất nhiều công việc vẫn có thể được thực hiện mà không có db quản trị viên." sau đó tôi hỏi, tại sao bạn tin rằng sự sao chép uni-direction là quá kỳ lạ đến mức nó là một công thức rõ ràng cho thảm họa?

Tạo bản sao của bảng không phải là khoa học tên lửa. Trong thực tế nó hoàn toàn đơn giản như nhân đôi chìa khóa nhà của bạn. Mỗi đỉnh và thung lũng trong tổng thể, được truyền đến một bánh xe cắt có hình trống. Trường hợp có một số phép thuật trong bản sao đa chủ, nếu bạn bắt đầu cho phép thay đổi tại cơ sở dữ liệu từ xa với dữ liệu đến từ dữ liệu quản trị, thì bạn đã mở ra một thiết kế nghiêm túc.

Tôi không nói rằng đây là cách để đi, trước tiên bạn phải trả lời câu hỏi ban đầu của mình. Sau đó, nếu bạn muốn tiếp tục hoạt động ... đừng giảm giá khả năng sao chép.

0

Tôi tự hỏi nếu SQL Server có một tính năng như quan điểm vật chất của Oracle? Đây là một đối tượng mà bạn định nghĩa với một truy vấn như một khung nhìn, nhưng kết quả của truy vấn được lưu trữ như một bảng. Sau đó, có nhiều cơ chế khác nhau để tự động làm mới.

Nếu có tính năng như vậy, tôi khuyên bạn nên thực hiện chế độ xem vật chất của (các) bảng cốt lõi trong mỗi cơ sở dữ liệu vệ tinh. Sau đó, bạn có thể tham khảo điều đó trong các khóa ngoại của bạn. Vấn đề chính là liệu nó có thể được làm mới thường xuyên đủ cho nhu cầu của bạn hay không.

1

Bạn nên triển khai Kiến trúc hướng dịch vụ. Nơi các dịch vụ khác nhau trong hệ thống đang chạy với lược đồ cơ sở dữ liệu của chúng. Sau đó, cho phép các ứng dụng chạy độc lập với bất kỳ cơ sở dữ liệu nào nhưng để chúng chạy trên các dịch vụ.

1

Bạn có thể giải quyết vấn đề này theo một số cách kiến ​​trúc để kênh tất cả các thay đổi thông qua một dịch vụ trung tâm để chúng không thể tạo ra mâu thuẫn, nhưng bất kể bạn cố gắng bao nhiêu công sức (và tạo một nút cổ chai hoặc một điểm thất bại có thể vi phạm một số yêu cầu khác mà bạn có), bạn sẽ không thể dựa vào cơ sở dữ liệu để thực thi nó với một sự bảo đảm như bạn có thể với một ràng buộc FK.

Tôi thường phải đối phó với điều này trong các tình huống cơ sở dữ liệu liên phòng, nơi mọi thứ có thể không đồng bộ vì hệ thống khác nhau chưa được tích hợp đầy đủ hoặc các mối quan ngại về bảo mật yêu cầu họ phải có quản trị viên riêng biệt.

Trong những trường hợp này, tôi thường dựa vào các báo cáo ngoại lệ được tạo theo giờ, kiểm tra trạng thái của mọi thứ và chỉ báo cáo nếu có sự cố. Các tác vụ của SQL Server Agent có khả năng lên lịch mạnh mẽ.Tôi luôn sử dụng các bảng nhật ký và SQLAnswersMail để tạo ra các email HTML đẹp (nơi các liên kết URL trong các email thậm chí có thể đưa bạn đến các trang quản trị để khắc phục vấn đề) cho các quản trị viên hệ thống khác nhau, nhưng có rất nhiều cách để làm cho con mèo này.

0

Tôi nghĩ rằng điều thú vị là bạn có thể tạo một bản sao MS Access nhỏ của cơ sở dữ liệu, thực thi RI trong Access .. và sau đó upsize và Microsoft Access cung cấp cho bạn tùy chọn để chọn giữa việc sử dụng Trình kích hoạt hoặc DRI .. và tôi khá chắc chắn rằng Microsoft Access sẽ viết các phần cốt lõi của trình kích hoạt cho bạn.

Trong khi chúng tôi đang ở trên chủ đề, tôi ghét MS Access .. nhưng một điều vượt trội hơn với Access, là bạn có thể thực thi RI dựa trên QUERY (sql select, aka view) .. Tôi thực sự mong muốn MS SQL Server có chức năng tương tự.

+0

Xác nhận về việc thực thi RI với các truy vấn là không đúng sự thật. Bạn có thể tạo RELATIONSHIP, nhưng nó không thể thực thi tính toàn vẹn quan hệ - nó chỉ thiết lập các đường mối quan hệ mặc định khi bạn thả các bảng vào trình thiết kế truy vấn. –

+0

Để tăng kích cỡ cơ sở dữ liệu Jet/ACE lên SQL Server, SQL Server Migration Assistant khá tốt. Nó cho phép bạn kiểm tra sự bực dọc của bạn và cho bạn biết những gì mọi thứ không hoạt động tốt để bạn có thể sửa chúng trước khi bạn thực sự tăng kích thước thực tế. Đây là điều mà trình hướng dẫn tăng kích cỡ không làm. Có một số điều nó không làm (một số quy tắc xác nhận đơn giản bị bỏ qua), nhưng nó nhận được hầu hết mọi thứ. –

+0

Tôi thích truy cập upsizing để SSMA, vì truy cập upsizing hỗ trợ di chuyển để truy cập dữ liệu dự án. Dù bằng cách nào, đối với hầu hết các dự án Access nhỏ - 10 bảng và 50 truy vấn - tôi có thể upsize và viết lại các truy vấn trong một hoặc hai giờ. Các lợi thế về hiệu năng khi sử dụng SQL Server là phi thường. –

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