2010-08-04 37 views
6

Yêu cầu là lưu trữ tệp đính kèm cho các loại thực thể khác nhau.Cách tốt nhất để thiết kế kịch bản cơ sở dữ liệu này là gì?

Giả sử chúng tôi có 3 loại thực thể Công ty, Phòng và Nhân viên. Mỗi tệp có thể có nhiều tệp đính kèm (tài liệu).

Cách nào tốt nhất để xử lý việc này?

Giải pháp 1:

bảng Công ty

  • CompanyId

bảng Dept

  • deptID

nhân viên bàn

  • EmployeeID

bảng AttchmentType

  • typeid
  • loại (công ty, nợ, người lao động)

đính kèm bảng

  • AttachmentId
  • typeid (bản đồ để loại tập tin đính kèm)
  • ENTITYID (bản đồ để CompanyId/deptID/EmployeeID)

Ưu điểm: tôi có thể thêm các loại thực thể mới một cách dễ dàng trong tương lai

Nhược điểm: Trong trường hợp này tôi không thể có mối quan hệ khóa ngoại được duy trì giữa các thực thể và phần đính kèm.

Giải pháp 2:

bảng Công ty

  • CompanyId

bảng Dept

  • deptID

nhân viên bàn

  • EmployeeID

CompanyAttachments bảng

  • AttachmentId
  • CompanyId (FK)

DeptAttachments bảng

  • AttachmentId
  • deptID (FK)

EmployeeAttachments bảng

  • AttachmentId
  • EmployeeID (FK)

Ưu điểm: tính toàn vẹn chủ chốt Ngoại

Nhược điểm: Để thêm thực thể mới, tôi cần có bảng đính kèm mới riêng biệt.

Vì vậy, cách nào tốt nhất để đi với giả định tôi có thể cần phải thêm các thực thể mới trong tương lai?


Sửa 1:

Thanks for guys trả lời của bạn.

Nếu tôi muốn đi với giải pháp 2, tôi thấy rằng việc tạo cột mới trong bảng tệp đính kèm dễ dàng hơn thay vì tạo bảng đính kèm mới cho mọi thực thể chỉ để ánh xạ chúng? một cái gì đó như thế nào,

bảng Công ty

  • CompanyId

bảng Dept

  • deptID

bảng Employee

  • EmployeeID

đính kèm

  • AttachmentId
  • CompanyId (FK)
  • EmployeeID (FK)
  • DepartmentId (FK)

Tôi có thiếu cái gì ở đây không?

+0

Các bạn đã nhìn NoSQL tài liệu dựa trên (ví dụ: CouchDB) cơ sở dữ liệu? – JNK

Trả lời

3

Tôi bỏ phiếu cho giải pháp 2 vì cách này bạn có thể thực thi tính toàn vẹn tham chiếu theo cách phù hợp. Ngoài ra, bạn có thể dễ dàng (nếu cần) thêm các trường cho phần đính kèm đặc biệt (ví dụ EmployeeAttachments có thể có một trường bit "PersonalPicture" hoặc tương tự)

+1

+1, 'thêm trường cho người dùng tệp đính kèm đặc biệt' cuối cùng sẽ muốn điều này. –

5

Tôi chắc chắn sẽ đi với giải pháp # 2. Một chuyên gia của bạn cho giải pháp # 1 không thực sự là một chuyên nghiệp. Nếu bạn thêm một thực thể mới, bạn sẽ nhất thiết phải thêm một bảng mới cho thực thể đó và bạn đã thêm hoặc thay đổi mã hiện có để xử lý nó. Bạn sẽ có thể thực hiện một số đối tượng chung để xử lý mẫu để mã trùng lặp không phải là vấn đề.

+1

Tính toàn vẹn của dữ liệu được thực thi thông qua các FK sẽ giảm thời gian bảo trì (đặc biệt là một loại bảo trì có thể không bao giờ cần thiết) mỗi lần! – HLGEM

+1

+1, giải pháp # 1 có thể có probelms, điều gì sẽ xảy ra khi bạn có cùng giá trị khóa trong CompanyId/DeptId/EmployeeId, giống như nếu bạn sử dụng giá trị tăng/nhận dạng tự động. –

2

tôi sẽ đi với tùy chọn 2.

Something như thế này:

alt text http://img84.imageshack.us/img84/815/dbso.png

+0

Tôi thích giải pháp này, vì bảng đính kèm sẽ có các thuộc tính giống nhau cho tất cả các thực thể. – puzzled

+0

@puzzled Các trường không phổ biến sẽ chuyển đến các bảng chuyên biệt của chúng – Tassadaque

+0

Hình ảnh không hiển thị. –

0

Những điều khác để xem xét:

Bạn sẽ cần phải cuộn lên file đính kèm? tức là tài liệu đính kèm của nhân viên có liên quan đến bộ phận của họ và công ty của họ? nếu đây là truy vấn thường xuyên, một bảng tệp đính kèm duy nhất và tùy chọn bảng tra cứu thực thể chỉ mục riêng biệt và nhiều chỉ mục có thể cho hiệu suất truy vấn tốt hơn.

Ngoài ra, các tệp đính kèm có nhiều và/hoặc đủ lớn để bạn đặt (các) bảng đó trên thiết bị riêng biệt hoặc hệ thống lưu trữ khác (tức là con trỏ hệ thống tệp) không? Quản lý là một vấn đề cũng như hiệu suất.

+0

Không. Tệp đính kèm chỉ liên quan đến thực thể tương ứng của chúng và không được cuộn lên. Bảng tệp đính kèm chỉ lưu trữ filepath/url. Các tệp thực tế được lưu trữ trên máy chủ tệp. – puzzled

+0

Được rồi, các bảng riêng biệt là cách để đi. Tôi nghĩ bạn sẽ có một cái nhìn công đoàn về tất cả các tên tệp hoặc đường dẫn, để bạn có thể kiểm tra dữ liệu. tức là nếu ai đó vô tình xóa tệp, v.v. Ngoài ra nếu cần lưu trữ, hãy nghĩ về cách bạn xử lý nội dung nén và di chuyển đến các thiết bị khác nhau (ví dụ: từ đĩa này sang đĩa khác sang DVD, v.v.) – Rawheiser

2

Hy vọng điều này là tự giải thích.

attachment_model_v1

+1

Cảm ơn Damir . Tôi hy vọng đây phải là giải pháp tối ưu, nếu chúng ta bắt đầu từ đầu. Nhưng thật không may trong trường hợp của tôi, các thực thể đã được sử dụng, với các Id riêng của họ tại chỗ. – puzzled

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