Bạn có nên thiết kế cơ sở dữ liệu trước khi viết mã ứng dụng?


57

Cách dễ nhất và hiệu quả nhất để thiết kế cơ sở dữ liệu là gì? Từ góc nhìn của tôi, có một vài lựa chọn cho thiết kế cửa hàng dữ liệu của ứng dụng:

  1. Thiết kế cơ sở dữ liệu tốt nhất có thể ban đầu trước khi viết bất kỳ mã ứng dụng nào . Điều này cung cấp cho bạn lợi thế của việc có một cấu trúc dữ liệu cơ sở để làm việc. Theo tôi, nhược điểm của điều này là bạn sẽ có nhiều thay đổi vì các chi tiết cụ thể của ứng dụng ảnh hưởng đến những gì / nơi / cách thức thay đổi dữ liệu trong suốt chu kỳ phát triển ứng dụng.
  2. Thiết kế cơ sở dữ liệu khi ứng dụng đi đến kết quả . Khi bạn cần một số đối tượng cơ sở dữ liệu khi bạn viết ứng dụng, bạn phát triển cơ sở dữ liệu song song (theo thời gian) cho ứng dụng. Những lợi thế sẽ ít thay đổi cấu trúc cơ sở dữ liệu như tôi thấy. Nhược điểm sẽ là sự phân chia thời gian và nỗ lực phát triển giữa mã ứng dụng và phát triển cơ sở dữ liệu.

Theo kinh nghiệm của bạn, bạn thấy phương pháp nào hiệu quả và hiệu quả nhất?


Chia rẽ và chinh phục với SDLC
Premraj

1
Bạn có thể thấy flywaydb.org thú vị. Nó cho phép bạn phiên bản kiểm soát lược đồ cơ sở dữ liệu của bạn.
Thorbjørn Ravn Andersen

Câu trả lời:


41

Ngoài những câu trả lời khác ...

Nắm bắt mô hình khái niệm của bạn trước tiên nên xác định phạm vi và yêu cầu. Từ đó, bạn có thể rút ra mô hình dữ liệu logic và vật lý của mình.

Một khi điều này chủ yếu là tĩnh, thì bạn có một cơ sở dữ liệu ổn định để xây dựng ứng dụng của mình. Điều này trái với lựa chọn đầu tiên của bạn.

Điểm thứ hai của bạn sẽ kết thúc trong một quả bóng bùn lộn xộn, không thể nhầm lẫn . Mô hình dữ liệu sẽ không bao giờ được sửa chữa: nếu bạn không thiết kế trước, bạn sẽ không có thời gian để sửa nó trước khi vận chuyển. Bạn sẽ quá bận rộn để hack mọi thứ cùng nhau.

Thay đổi nhỏ đối với lược đồ, kết hợp hoặc tách bảng, thay đổi mối quan hệ, v.v. sẽ xảy ra, nhưng trong "đảo" cục bộ, và mô hình + thiết kế cơ bản của bạn sẽ không thay đổi.


6
Và tính ổn định rất quan trọng, bởi vì tên bảng và dạng xem, tên cột, tên thủ tục được lưu trữ, v.v., là giao diện chung của cơ sở dữ liệu. (Và sớm hay muộn sẽ có nhiều ứng dụng chia sẻ giao diện đó.)
Mike Sherrill 'Cat Recall'

Tôi muốn nói rằng đây là cách tiếp cận khá lý tưởng hóa, kinh nghiệm của tôi là sự thay đổi mạnh mẽ xảy ra theo thời gian, điều chúng ta cần là nhanh nhẹn và nhanh chóng thích nghi với các yêu cầu mới và tiếp tục tái cấu trúc.
nhấp nháy

@zinking: Tôi đang làm điều đó Agile ngay bây giờ.
gbn

@gbn, Xin lỗi để đặt câu hỏi dưới đây. Tôi không có ý tưởng làm thế nào để xử lý các kịch bản. Vui lòng có một cái nhìn. stackoverflow.com/questions/46285924/ Mạnh . Vui lòng gợi ý cho tôi giải pháp tốt hơn.
RGS

27

Bạn sẽ khó có thể tìm thấy bất kỳ bộ phận phần mềm hiện đại nào không vận hành một số biến thể của Agile. So sánh các DBA bị mắc kẹt trong thời kỳ đen tối, với kiểu suy nghĩ rằng câu trả lời của @ RobPaller vẫn còn chỗ chung.

Sửa đổi một lược đồ cơ sở dữ liệu chưa bao giờ dễ dàng như sửa đổi mã, đó là lý do tại sao đã có sự miễn cưỡng chấp nhận một cách tiếp cận nhanh để phát triển và bảo trì cơ sở dữ liệu. Bây giờ chúng tôi có các công cụ và kỹ thuật để vận hành theo cách tương tự như các nhà phát triển, chúng tôi chắc chắn nên làm. Chỉ vì không dễ thay đổi lược đồ, không có nghĩa là bạn không thể và bạn không nên.

Tôi không ủng hộ cách tiếp cận hỗn loạn trong thiết kế cơ sở dữ liệu (xem bình luận), chỉ đơn thuần là một cách tiếp cận phản ánh chặt chẽ hơn với nhóm phát triển nhanh. Nếu bạn là một phần của dự án nhanh, bạn sẽ không có yêu cầu cho công việc có thể ( hoặc có thể không ) xảy ra trong tương lai, vì vậy thiết kế cho những gì bạn biết là cần thiết, không phải là những gì có thể.

Tôi đoán rằng sẽ bỏ phiếu của tôi với tùy chọn 2 của bạn và tôi nghi ngờ tôi có thể thấy mình đứng trong cái lạnh này!


4
Agile và cơ sở dữ liệu đi cùng với hãy cẩn thận. Agile là đường biên giới cho VLDB: có thể không có đủ thời gian để xác nhận và kiểm tra các thay đổi đối với hàng tỷ bảng hàng giữa các sản phẩm giao. Và "phát triển nhanh" không giống như "thay đổi bán buôn" vì thiếu suy nghĩ
gbn

2
Không thể đồng ý nhiều hơn: thiếu suy nghĩ nhưng tôi không nghĩ rằng điều đó có liên quan đến câu hỏi. Đây không phải là về việc bạn có nên tiếp cận thiết kế một cách ngớ ngẩn hay không mà là liệu mô hình dữ liệu của bạn có nên phát triển như ứng dụng hay không. Các vấn đề VLDB đảm bảo một chỉnh sửa mà tôi sẽ thêm.
Mark Storey-Smith

3
Tôi đã đọc câu hỏi là "một ứng dụng mới chưa có DB" thay vào đó là "một ứng dụng hiện có yêu cầu thay đổi đối với DB"
gbn

Tương tự như vậy, tôi đang thiếu quan điểm của bạn ở đâu đó :) Một người cần trò chuyện?
Mark Storey-Smith

4
+1 cho tâm lý chung cho câu trả lời của bạn, nhưng "Sửa đổi lược đồ cơ sở dữ liệu chưa bao giờ dễ như sửa đổi mã" thực sự phụ thuộc vào số lượng mã bạn có (và độ tuổi của nó). IMO thì ngược lại thường đúng hơn
Jack Douglas

12

Mô hình dữ liệu lôgic của bạn sẽ nắm bắt hiệu quả các yêu cầu nghiệp vụ của ứng dụng của bạn. Thiết kế cơ sở dữ liệu vật lý của bạn phải dựa trên mô hình dữ liệu lôgic kết hợp với các thay đổi cần thiết mà bạn là một DBA cảm thấy cần thiết để tối đa hóa hiệu quả của RDBMS.

Nếu bạn thấy rằng bạn phải thực hiện nhiều thay đổi đối với thiết kế cơ sở dữ liệu cơ bản thông qua vòng đời phát triển phần mềm của ứng dụng thì đó là dấu hiệu của hai điều:

  1. Phạm vi creep - Bạn đang cho phép các yêu cầu mới được đưa ra vào thời điểm không phù hợp.
  2. Yêu cầu kinh doanh không đủ - Nhà mô hình dữ liệu của bạn (hoặc nhà phân tích hệ thống) không dịch đủ các yêu cầu từ nhà phân tích kinh doanh. Điều này dẫn đến một mô hình dữ liệu không đầy đủ hoặc không chính xác để hỗ trợ các yêu cầu của ứng dụng của bạn.

Điều đó được nói rằng một khi một ứng dụng đã được chuyển sang sản xuất, không có gì phải quay lại và thực hiện các thay đổi lặp lại cho mô hình dữ liệu để hỗ trợ sự phát triển tự nhiên của ứng dụng hoặc các quy trình kinh doanh cơ bản.

Hi vọng điêu nay co ich.


7
Thêm nhiều yêu cầu mới trong quá trình thực hiện dự án không "không phù hợp". Đó là điều mà các phương pháp phát triển của bạn phải hỗ trợ và khuyến khích www.agilemanifesto.org/principles.html
nvogel

1
Tôi nhận thức rõ về một số nguyên tắc phát triển nhanh và là người đề xuất chúng trong khả năng lưu trữ dữ liệu, điều này có ý nghĩa đối với doanh nghiệp. Cám ơn bạn đã góp ý.
RobPaller

11

Tôi đã rất thích thiết kế một số cơ sở dữ liệu có độ phức tạp trung bình, tất cả được sử dụng trong các doanh nghiệp, với nhiều giao diện khác nhau bao gồm web, Access và C #.

Thông thường, tôi đã ngồi xuống và làm việc với lược đồ cơ sở dữ liệu trước. Điều này luôn có ý nghĩa nhất đối với tôi. Tuy nhiên, đã không có một trường hợp nào mà tôi không thực hiện thay đổi, thêm bảng mới hoặc sống với các khía cạnh làm phiền tôi và về cơ bản là quá muộn để khắc phục.

Tôi không nghĩ cách chữa là viết mã trước. Và tôi không nghĩ vấn đề là "không đủ yêu cầu kinh doanh" hoặc ít nhất, không phải là một vấn đề có thể được giải quyết đầy đủ. Người dùng không biết họ cần gì và tôi không có khả năng khiến họ suy nghĩ nhiều hơn hoặc thông minh hơn hoặc nhận thức rõ hơn hoặc trả lời câu hỏi của tôi tốt hơn. Hoặc họ tranh luận và tôi được lệnh phải làm một cái gì đó theo một cách nhất định.

Các hệ thống tôi xây dựng thường ở những khu vực mới mà chưa có ai đi vào trước đó. Tôi không mua từ tổ chức, tài nguyên hoặc công cụ để thực hiện công việc mà một nhóm phát triển gồm các chuyên gia thiết kế hàng đầu có thể được trả tiền như một đội gấp mười lần những gì tôi làm để xây dựng mọi thứ gấp đôi thời gian

Tôi rất giỏi trong những gì tôi làm. Nhưng chỉ có một trong số tôi làm điều đó trong một môi trường "không phát triển."

Tất cả những gì đã nói, tôi đang trở nên tốt hơn trong việc khám phá các quy tắc kinh doanh. Và tôi thấy một loại tùy chọn thứ ba:

Trước khi bạn thiết kế cơ sở dữ liệu và trước khi viết bất kỳ mã nào, hãy vẽ các màn hình thô cho biết ứng dụng sẽ hoạt động như thế nào. Chúng phải được vẽ bằng tay để ngăn bất kỳ ai bình luận về phông chữ hoặc kích thước hoặc kích thước - bạn chỉ muốn chức năng.

Với giấy trong suốt và các mảnh giấy bạn có thể trao đổi trong và ngoài, có một người là máy tính, hai người là người dùng chuyên môn phi kỹ thuật (hai người nói to) và một người ở đó làm người hướng dẫn ghi chú và rút thăm ra cho người dùng về quá trình suy nghĩ và nhầm lẫn của họ. Người dùng "nhấp chuột" và kéo và viết vào hộp, "máy tính" cập nhật màn hình và mọi người đều được trải nghiệm thiết kế. Bạn sẽ học được những điều bạn không thể học được cho đến khi đi sâu vào quá trình phát triển.

Có lẽ tôi đang mâu thuẫn với chính mình - có lẽ đó là khám phá yêu cầu tốt hơn. Nhưng ý tưởng là thiết kế ứng dụng trước, không cần viết bất kỳ mã nào. Tôi đã bắt đầu làm điều này ở quy mô nhỏ, và nó đang hoạt động! Mặc dù các vấn đề trong môi trường của tôi, nó giúp tôi có được cơ sở dữ liệu được thiết kế tốt hơn ngay từ đầu. Tôi biết rằng một cột phải di chuyển vào một bảng cha mới vì có nhiều loại. Tôi biết rằng danh sách công việc phải có các đơn hàng thường trực không đến từ hệ thống đơn hàng tích hợp. Tôi học đủ thứ!

Theo tôi, đây là một chiến thắng rất lớn.


+1 Câu trả lời tuyệt vời. Phát triển các yêu cầu được tạo điều kiện là một điểm cộng lớn trong một dự án nhiều bên liên quan.
Zayne S Halsall

10

Đối với hầu hết các mục đích, tôi chọn Tùy chọn 2: Xây dựng cơ sở dữ liệu song song với các thành phần khác. Bất cứ nơi nào có thể có một cách tiếp cận lặp đi lặp lại và cung cấp chức năng đầu cuối khi bạn xây dựng từng phần.

Điều này không có một số kỷ luật dự án nhất định. Áp dụng chuẩn hóa nghiêm ngặt (Boyce-Codd / Mẫu thứ năm) mỗi khi bạn thay đổi cơ sở dữ liệu để duy trì chất lượng và không kết thúc với một mô hình đặc biệt và không nhất quán. Càng nhanh càng tốt với các quy tắc kinh doanh và các ràng buộc cơ sở dữ liệu tiếp viên. Nếu nghi ngờ, tốt hơn là thực thi một ràng buộc sớm - bạn luôn có thể đưa nó ra sau. Hãy thông minh về thứ tự bạn thực hiện các thành phần kiến ​​trúc để giảm thiểu nợ kỹ thuật. Có một bộ hướng dẫn thiết kế cơ sở dữ liệu tốt mà tất cả các nhà phát triển mua vào.

Tất cả điều này tất nhiên cần phải đi đôi với các thực tiễn kỹ thuật phát triển tốt khác: tích hợp liên tục, tự động hóa thử nghiệm và chủ yếu từ góc độ cơ sở dữ liệu, tạo dữ liệu thử nghiệm. Kiểm tra việc tạo dữ liệu của dữ liệu có kích thước thực nên được thực hiện trong mỗi lần lặp mà không thất bại.


2
Bạn không nghĩ rằng một số suy nghĩ trả trước sẽ là cần thiết để xác định mô hình khái niệm?
gbn

Một số suy nghĩ trả trước có thể hữu ích nhưng cố gắng xác định trước toàn bộ mô hình thường phản tác dụng. Mô hình phải phù hợp với các yêu cầu kinh doanh và phù hợp với các sản phẩm dự án (bao gồm ứng dụng) khi chúng phát triển. Bạn không thể và không nên mong đợi những điều đó sẽ không thay đổi. Ngoài ra, việc tạo toàn bộ mô hình trả trước thực sự có thể cản trở sự phát triển khác do nhu cầu tạo giao diện giả để hỗ trợ các phần chưa được sử dụng của lược đồ.
nvogel

Tôi nghi ngờ @dportas và tôi làm việc trong các môi trường tương tự :)
Mark Storey-Smith

9

Trong thế giới kiến ​​trúc, cụm từ "Chức năng theo mẫu" được đặt ra và sau đó được tuân thủ khi xây dựng các tòa nhà cao tầng. Điều tương tự nên được áp dụng cho cơ sở hạ tầng DB và phát triển ứng dụng.

Hãy tưởng tượng viết một ứng dụng, quyết định nhanh chóng rằng bạn cần một cái bàn ở đây và một cái bàn ở đó. Khi ứng dụng của bạn hoàn tất, bạn có một số lượng lớn các bảng được coi là mảng. Nhìn vào tất cả các bảng cạnh nhau, các bảng chắc chắn sẽ xuất hiện không có vần điệu hoặc lý do.

Thật không may, một số cửa hàng dành cho nhà phát triển sẽ chọn thứ gì đó như memcached, tải dữ liệu bằng RAM (do đó coi nó như ống dẫn dữ liệu) và có cơ sở dữ liệu, như MySQL hoặc PostgreQuery, hoạt động đơn giản như một đơn vị lưu trữ dữ liệu.

Ưu đãi cho việc sử dụng cơ sở dữ liệu phải là xem xét nó một cách chính xác: như là một RDBMS. Có, một hệ thống quản lý cơ sở dữ liệu quan hệ. Khi bạn sử dụng RDBMS, mục tiêu trả trước của bạn không chỉ là thiết lập các bảng để lưu trữ mà còn cho việc truy xuất. Mối quan hệ giữa các bảng nên được mô hình hóa sau dữ liệu bạn muốn xem và cách trình bày. Điều này nên được dựa trên sự gắn kết và tính toàn vẹn của dữ liệu cùng với các quy tắc kinh doanh đã biết. Những quy tắc kinh doanh đó có thể được mã hóa trong ứng dụng của bạn (Perl, Python, Ruby, Java, v.v.) hoặc trong cơ sở dữ liệu .

PHẦN KẾT LUẬN

Tôi chắc chắn sẽ đi với tùy chọn 1. Nó cần lập kế hoạch phù hợp, mô hình hóa dữ liệu và phân tích dữ liệu đang diễn ra. Tuy nhiên, điều này sẽ giảm thiểu thay đổi cơ sở dữ liệu trong thời gian dài.


1
@RolandoMySQLDBA, bạn có cho rằng một thiết kế cơ sở dữ liệu được xây dựng trong quá trình phát triển ứng dụng sẽ là một thiết kế kém hơn so với trước đây được xây dựng? Tại sao? Điều ngược lại thường đúng.
nvogel

1
@dportas: Tôi nhấn mạnh vào tùy chọn 1 về việc giảm thiểu các thay đổi trong thiết kế DB. Tôi đã dành 2/3 chương trình nghề nghiệp công nghệ của mình trong các cửa hàng nơi các mô hình dữ liệu và cơ sở hạ tầng rất phức tạp đang bị thay đổi gần như hàng tháng. Tôi chùn bước trước những thay đổi như vậy bởi vì nhu cầu và mục tiêu kinh doanh không được khắc sâu. Tôi là trường học khá cũ trong này. Không có gì sai khi là một người ít nói, miễn là thiết kế không tạo ra nhiều 'nợ kỹ thuật' (Vâng, tôi đọc bạn trả lời) trên đường.
RolandoMySQLDBA

2
+1 cho 'sử dụng RDBMS làm cơ sở dữ liệu quan hệ chứ không phải là nhóm bit cho mảng' - bất kỳ cách tiếp cận nào bạn thực hiện
Jack Douglas

2
@dportas: mặc dù điều này là đúng (thay đổi quy tắc kinh doanh), một db được thiết kế tốt sẽ không thay đổi hoàn toàn giữa một lần lặp (hoặc chạy nước rút, hoặc bất cứ điều gì) và vì điều khác, vì nó phản ánh tất cả các cấu trúc dữ liệu có liên quan của quy trình làm việc. Nếu điều này xảy ra (thay đổi căn bản), có nghĩa là thất bại trong các quy tắc kinh doanh nắm bắt các hoạt động.
Fabricio Araujo

3
@dportas: không phải tất cả các thay đổi DB, chỉ có những thay đổi. Những thay đổi nhỏ là một phần của việc kinh doanh làm phần mềm. Nhưng việc phải phân chia dữ liệu trong 2 cơ sở dữ liệu khác nhau giữa công việc là một thất bại về thiết kế và các quy tắc kinh doanh nắm bắt. (Nó thực sự đã xảy ra với tôi.
Fabricio Araujo

9

Tôi nghĩ rằng nó nên được thực hiện trước khi có bất kỳ thực tế nào cho ứng dụng, nhưng không phải trước khi ứng dụng được thiết kế.

Quy trình làm việc điển hình của tôi, nếu làm việc một mình là:

  1. Xác định những gì ứng dụng cần làm
  2. Nhìn để xem nếu bất kỳ nhiệm vụ có thể được chia nhỏ cho các thành phần có thể tái sử dụng
  3. Xác định cách mỗi tác vụ cần tương tác với bộ lưu trữ dữ liệu - loại câu hỏi nào họ sẽ hỏi về dữ liệu, tần suất họ sẽ viết, v.v.
  4. Thiết kế cơ sở dữ liệu để nó có thể trả lời tất cả các câu hỏi chúng ta cần hỏi về nó và sẽ thực hiện tốt cho các nhiệm vụ thường xuyên nhất.
  5. Viết đơn.

Vì tôi thường xuyên làm việc như một phần của một nhóm và chúng tôi phân tán về mặt địa lý (và qua các múi giờ), chúng tôi có xu hướng có một cuộc họp khởi động ban đầu:

  1. Xác định những gì ứng dụng cần làm.
  2. Xác định các điểm tốt để chia ứng dụng thành các thành phần độc lập
  3. Xác định cách mỗi thành phần sẽ cần tương tác với các thành phần khác.
  4. Đồng ý về API cho từng tương tác.

Sau đó, chúng tôi trở về nhà, viết phần của chúng tôi và nếu một thành phần cần lưu trữ cục bộ của riêng nó, miễn là người bảo trì cho phần đó giữ cho API phù hợp với mô-đun của họ. Việc lưu trữ dữ liệu chính được xử lý như một mô-đun với API riêng và mọi người dự kiến ​​sẽ ghi vào nó. (trong trường hợp tốc độ DB là quan trọng, API là định nghĩa bảng và nếu thay đổi được thực hiện, chúng tôi sử dụng chế độ xem hoặc một số cơ chế khác để trình bày phiên bản cũ hơn cho đến khi tất cả các mô-đun có thể được cập nhật)


1
Trường hợp cho tùy chọn 2 là với một phương pháp nhanh, bạn không biết 1, 2 hoặc 3 vượt quá phạm vi cho lần chạy nước rút tiếp theo. Thay đổi là không thể tránh khỏi, trong phạm vi, yêu cầu và kỳ vọng.
Mark Storey-Smith

8

Tôi ghi nhớ quy tắc follwing: "bạn chỉ có thể lấy từ cơ sở dữ liệu thông tin mà bạn có dữ liệu để tạo". Vì vậy, tôi thiết kế cơ sở dữ liệu đầu tiên sau mã.

Tại sao? Bất kể tôi sử dụng phương pháp đo lường / ngôn ngữ / bộ công cụ nào, nếu tất cả dữ liệu liên quan được thiết kế và lưu trữ tốt trong DB tôi có thể truy xuất nó. Không có vấn đề nếu là trong C # / Delphi / FORTRAN / COBOL / hội / VBA hoặc Crystal báo cáo; OO được thiết kế hoặc sự kiện / dữ liệu / bất cứ điều gì; nhanh nhẹn hoặc thác nước. Nếu dữ liệu ở đó, tôi có thể truy xuất nó nếu các công cụ tôi sử dụng có thể kết nối với cơ sở dữ liệu. Tôi có thể tạo các báo cáo bán hàng nếu tôi có thể CHỌN các đơn đặt hàng cho doanh thu của quý - ngay cả khi tôi phải viết từng byte theo hội đồng.

Nếu dữ liệu liên quan không có ở đó hoặc thậm chí nếu nó ở đó nhưng (un) được cấu trúc theo cách tôi không thể truy xuất thông tin tôi cần - làm thế nào để mã hóa nó?


7

Như thường lệ, nó phụ thuộc;)

Chẳng hạn, giả sử rằng chúng ta có một nguyên mẫu làm việc kích thước nhỏ được phát triển bằng Python và sử dụng các tệp phẳng và người dùng hài lòng với các tính năng của nguyên mẫu, vì vậy tất cả những gì chúng ta cần làm là sản xuất nó, sử dụng RDBMS làm mặt sau của nó . Khi đây là trường hợp, thật hợp lý để mong đợi làm điều đó ngay lần đầu tiên - vấn đề là nhỏ và được xác định rõ. Trong trường hợp như vậy thiết kế lên phía trước là khả thi.

Mặt khác, khi chúng ta khám phá các yêu cầu trong môi trường Agile, chúng ta cần một vài lần lặp để hiểu chúng tốt hơn. Trong các tình huống như vậy, cơ sở dữ liệu phát triển với phần còn lại của ứng dụng. Đây là những gì chúng ta thường làm. Vì chúng tôi có thể cấu trúc lại các bảng OLTP trực tiếp mà không có bất kỳ thời gian chết nào và với rủi ro thấp, chúng tôi cảm thấy thoải mái với khả năng tái cấu trúc cơ sở dữ liệu.

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.