Là liên tục tạo và xóa các bảng là một dấu hiệu của một lỗ hổng kiến ​​trúc?


11

Gần đây tôi đã thảo luận với một nhà phát triển đã đề cập rằng trong quá trình phát triển chương trình, họ thường xuyên tạo và xóa các bảng và cột một cách thường xuyên trong khi làm việc với các tính năng mới và những điều hợp lý bằng cách nói rằng điều này là bình thường khi sử dụng quy trình phát triển nhanh.

Vì hầu hết nền tảng của tôi là trong môi trường phát triển thác nước, tôi tự hỏi liệu điều này có thực sự được coi là phù hợp với sự phát triển nhanh hay không, nếu đây có thể là dấu hiệu của một vấn đề tiềm ẩn, với kiến ​​trúc chương trình hoặc với quy trình nhanh của chúng.


Một nhận xét về cơ sở dữ liệu, lần cuối cùng nó được kiểm tra có hơn 700 bảng và tôi đã nghe người khác đề cập rằng "không đủ thời gian để cấu trúc lại nó."
rjzii

24
700 bảng và không đủ thời gian để tái cấu trúc? Tôi có thể ngửi thấy mùi thất bại ở đây.
Adam Crossland

7
700 bảng USED hay 700 bảng trong đó có nhiều trẻ mồ côi?
Ben Brocka

1
@AdamCrossland Nghiêm túc ... Lynyrd Skynyrd's Smoh xuất hiện trong tâm trí. Nhưng trên một lưu ý nghiêm trọng, đôi khi các bảng không chuẩn hóa là một lựa chọn thiết kế tốt trên các cơ sở dữ liệu nặng hoặc đọc có tải báo cáo nặng.
maple_shaft

1
@maple_shaft Chắc chắn, bất kỳ công nghệ nào cũng có thể bị lạm dụng, giống như bất kỳ công nghệ nào khác bạn phải cân nhắc ưu / nhược điểm và kiểm tra, thử nghiệm, kiểm tra. Tuy nhiên, các khung nhìn cụ thể hóa có thể cung cấp cho bạn một lối thoát nếu bạn thấy mình không chuẩn hóa các bảng của mình. Tôi nghĩ rằng quan điểm của bạn chỉ là lý do hơn nữa để có một DBA hoặc ít nhất là một nhà phát triển có nhân viên DB-fu mạnh mẽ để kéo dây cương trở lại khi mọi người khác đang tiến lên với một thiết kế rõ ràng kém. Công việc tốt nhất của tôi đã đến không phải trong khi viết mã hay thiết kế, mà ngăn cản người khác đưa ra quyết định khủng khiếp, khủng khiếp.
Mike Cellini

Câu trả lời:


21

Nó ngày càng trở nên rõ ràng hơn đối với tôi mỗi ngày rằng "nhanh nhẹn" đang trở thành một từ đồng nghĩa với suy nghĩ kém, hỗn loạn, vội vã và ngồi trên quần của bạn. Và không ai trong số những điều đó tương thích với cách tiếp cận Agile như tôi hiểu.

Có một quy trình Agile hiệu quả và có thể lặp lại là không dễ dàng và tôi không tin rằng nó vốn đã làm giảm tổng số công việc phải hoàn thành mặc dù nó rất có thể dẫn đến các sản phẩm tốt hơn.

Nếu họ đã nói rằng họ không có thời gian để "cấu trúc lại" cơ sở dữ liệu thì có lẽ họ cũng không có thời gian để thiết lập phiên bản và di chuyển cho cơ sở dữ liệu. Có lẽ họ đã không dành thời gian để tạo ra một bộ thử nghiệm chức năng cho nó. Tất cả những điều đó là những gì tôi nghĩ khi tôi nghĩ về một quy trình Agile vững chắc hướng đến thành công.

Cuối cùng, Agile chỉ là một từ. Những gì bạn đang làm hàng ngày sẽ quyết định bạn sẽ thành công hay không.


2
Có quy trình Agile hiệu quả thực sự có nghĩa là công việc trả trước nhiều hơn vì tập trung nhiều lần vào việc chỉ cung cấp phần mềm chức năng sau mỗi lần chạy nước rút. Nếu được thực hiện đúng thì nó dẫn đến cơ hội thành công cao hơn. Thác nước thực sự hiệu quả hơn nhiều nếu bạn cho rằng các yêu cầu là tĩnh và tài nguyên dự án không mắc lỗi. Đây là tưởng tượng trong hầu hết các tình huống mặc dù.
maple_shaft

1
@maple_shaft, chỉ vậy thôi. Là Agile không loại bỏ công việc khó khăn từ việc xây dựng các sản phẩm.
Adam Crossland

2
Tôi có cảm giác nếu đội này đang sử dụng cách tiếp cận thác nước, nó sẽ hỗn loạn và mọi yêu cầu thay đổi sẽ là một thảm họa.
JeffO

Nói tốt, Jeff O.
Adam Crossland

11

Mặc dù không có gì bất thường khi tạo và xóa các bảng khi thiết kế phát triển, một số dọn dẹp có thể để đảm bảo cơ sở dữ liệu của bạn thực sự sử dụng tất cả các bảng đó.

Vâng, Agile là tất cả về tái cấu trúc, nhưng nếu bây giờ họ nói hệ thống này quá lớn để tái cấu trúc, họ đã ngừng làm Agile và giờ chỉ là lập trình Cowboy. Nhóm phát triển sẽ không thích được gọi như vậy, nhưng đó là những gì họ đang làm. Cưỡi tầm bắn bất cứ thứ gì di chuyển.

Một DBA sẽ giúp, chỉ cần đảm bảo bạn có được một DBA hiểu được sự phát triển cũng như phát triển Agile. Nhóm phát triển của bạn cần được kiểm soát, không bị tống vào tù.


5

Nói chung, việc thường xuyên tạo các bảng mới và thêm các cột mới là rất bình thường trong một quy trình mà việc lập trình và quản trị cơ sở dữ liệu không được tách biệt nghiêm ngặt. Một tính năng mới có thể tạo dữ liệu mới phải đi đâu đó. Cố gắng quá nghiêm ngặt để tránh điều đó và bạn kết thúc với một mô hình nền tảng bên trong .

Phần mềm được viết tốt hầu như không nhận thấy các đối tượng cơ sở dữ liệu mới này, vì vậy không có gì phá vỡ chỉ vì một cột mới trong một số bảng.

Mặt khác, việc thường xuyên thả các cột hoặc thậm chí các bảng là đáng ngờ. Một tính năng mới không bao giờ cần xóa bảng, vì vậy đây có thể là dấu hiệu của những người làm việc hoàn toàn vô kế hoạch.


1
Việc tạo các bảng và cột mới không làm phiền tôi khi nó hợp lý, nhưng nó đã chỉ ra rằng việc loại bỏ các bảng (và các cột cho vấn đề đó) thường có nghĩa là một số công việc bị mất do ai đó lên kế hoạch không phù hợp hoặc ai đó quyết định rằng Rốt cuộc, tính năng này không cần thiết. Tương tự như vậy, số lượng bảng cắt là một mối quan tâm do thiếu bình thường hóa trong chúng.
rjzii

Chính xác. Đừng lo lắng về số lượng lớn các bảng, dù sao hầu hết chúng đều không được sử dụng và có thể chúng sẽ bị loại bỏ sớm. SCNR
user281377

Vâng, vấn đề là tất cả chúng đều được sử dụng, ngay cả khi nó chỉ dành cho một bản ghi.
rjzii

4

Nếu cơ sở dữ liệu của bạn có thể dễ dàng được phiên bản và di chuyển và bạn đã có các bài kiểm tra để chứng minh rằng việc thay đổi mọi thứ không phá vỡ mọi thứ thì có lẽ bạn đã có một quy trình khá nhanh.

Trong các ý kiến ​​- nói chung với tác động của những điều này là một nhóm cao bồi tự cho mình là nhanh nhẹn - chạy la hét. Nhanh. Và đăng tất cả những gì bạn có thể lên thed Dailywtf.com để tất cả chúng ta có thể tận hưởng nỗi kinh hoàng của bạn.


Điều đáng buồn là cơ sở dữ liệu không dễ dàng được phiên bản, di chuyển và có thử nghiệm hạn chế tại chỗ tốt nhất. Các nhà phát triển thường ghi đè lên các thay đổi được thực hiện bởi các nhà phát triển khác.
rjzii

5
Chắc chắn lập trình Cowboy rồi. Nếu bạn có một nhóm quản lý đứng sau nỗ lực "Agile" này, hãy đảm bảo loại bỏ nhóm này cho họ rằng họ đang lạm dụng Agile và chỉ chạy điên cuồng.
Bill Leeper

1
@RobZ Agile không phải là lý do cho phạm vi kiểm tra đơn vị kém và thiết kế cơ sở dữ liệu kém. Nghe có vẻ như một mớ hỗn độn nóng.
maple_shaft

2
ừ! không được phiên bản !!! không có gì ngạc nhiên khi nó là một mớ hỗn độn. Tôi rùng mình khi nghĩ mã ứng dụng là như thế nào.
ozz

4
Về cơ bản nhóm này không làm gì nhanh nhẹn, họ chỉ là một nhóm AdHoc. Nếu có một cấu trúc quản lý tại chỗ, bạn có thể ẩn danh hoặc trực tiếp đưa ra mối quan tâm lên chuỗi. Nói với họ rằng bạn đang nhìn thấy một thảm họa lớn trong cơ sở dữ liệu, thiếu các bài kiểm tra và các thực tiễn không phù hợp đang được sử dụng để quản lý mã. Đội ngũ này đang hướng tới một FAIL khổng lồ.
Bill Leeper

3

Giống như hầu hết các câu trả lời ở đây trên StackExchange, câu trả lời phải là 'nó phụ thuộc'. Trong phát triển nhanh, các yêu cầu và thông số kỹ thuật được phát hiện trong quá trình thực hiện.

Tuy nhiên, với sự phát triển nhanh, khi một mô hình quan hệ được chuẩn hóa đúng cách, việc thêm các thuộc tính mới vào các mối quan hệ hiếm khi là một điều cần thiết, các thực thể mới thường nên tham chiếu đến các mô hình cũ hơn, được đưa ra một mô hình thích hợp.

Hầu hết các nhà phát triển không bình thường hóa DB của họ vì hạn chế về thời gian, sự lười biếng, không đủ năng lực hoặc độ phức tạp của truy vấn. Việc tái chuẩn hóa đòi hỏi phải chuyển dữ liệu hiện có, sửa đổi DAO, v.v ... tạo ra yếu tố rủi ro.


Tại thời điểm nào trong quy trình nhanh, mô hình thích hợp cho tất cả các yêu cầu thay đổi trong tương lai sẽ xuất hiện một cách kỳ diệu?
Jeff

Sau khi nghiên cứu đúng tên miền. Có một số lượng hạn chế các thuộc tính xác định hoàn toàn một thực thể. Một số ví dụ (ngày càng phức tạp): một điểm 2D được xác định hoàn toàn bởi hai tọa độ, một địa chỉ được xác định hoàn toàn bởi một quốc gia, một phiên bản trường và thực hiện một tập hợp các trường địa chỉ được xác định bởi một thực thể khác (sử dụng id quốc gia, một phiên bản và các ràng buộc).
Dibbeke

@Dibbeke: Và sau đó bạn gặp các vấn đề kinh doanh như đối xử với EU (27 quốc gia) như một quốc gia duy nhất trong các trường hợp X, Y và Z. Hoặc coi các quốc gia Hoa Kỳ là các quốc gia. Hoặc doanh nghiệp nhận ra rằng một số mục DB có 2 biểu diễn địa chỉ cho một địa chỉ.
MSalters

3

Để trả lời câu hỏi của bạn, không, điều đó không bình thường trong quy trình Agile.

Trường hợp dường như xuất phát từ thái độ Agile là từ chu trình thiết kế / phát triển / thử nghiệm ngắn của Agile và nhấn mạnh vào các giải pháp nhẹ đáp ứng các yêu cầu đã biết của Agile, nhưng được cấu trúc tốt để có thể đáp ứng các yêu cầu mới với thay đổi tối thiểu. Với hai điều này, bạn có thể nói rằng một nhà phát triển, không biết điều gì có thể xảy ra nhưng biết thay đổi của anh ta không nên tác động đến DB theo cách không thể hoàn tác, chỉ cần thực hiện các thay đổi cần thiết cho lược đồ trong Cách "nhẹ nhất" có thể, và sau đó, một vài bộ thay đổi "ánh sáng" sẽ được tái cấu trúc thành một thứ gì đó lâu dài và ổn định hơn.

Có nói rằng, tôi chưa làm việc với một nhà phát triển đã đăng ký lý thuyết và phương pháp Agile, và cũng nghĩ rằng việc tạo và xóa các bảng trong lược đồ là cần thiết vì bất kỳ lý do nào. Agile không có nghĩa là slap-dash hoặc bolt-on. Nếu bạn được cung cấp một câu chuyện yêu cầu thêm một trường dữ liệu mới thuộc về một bản ghi cụ thể, bạn thêm trường vào bảng. Nếu sự thay đổi đó phá vỡ điều gì đó, bạn sẽ hiểu tại sao và thực hiện các thay đổi khác là cần thiết (tôi có thể nghĩ ra rất ít điều sẽ phá vỡ bằng cách thêm một cột vào DB được truy vấn; nếu nó phá vỡ với loại thay đổi này bạn có vấn đề lớn hơn). Tái cấu trúc thường được giới hạn trong mã; thay đổi lược đồ thường là một quá trình liên quan nhiều hơn thay đổi mã, và vì vậy khi thay đổi lược đồ phải xảy ra, chúng thường được thực hiện cẩn thận hơn, và ít nhất một số chú ý đến kiến ​​thức về định hướng tương lai của dự án. Phải cấu trúc lại một số hoặc tất cả các cơ sở dữ liệu cho thấy sự thất bại cơ bản của thiết kế; Là Agile không có nghĩa là không có "kế hoạch tổng thể" về các quy tắc thiết kế và kiến ​​trúc cơ bản để tuân theo trong khi xây dựng một cách hữu cơ chương trình và cấu trúc dữ liệu.

Bây giờ, có những trường hợp trong Agile nơi mà những gì bạn "biết" bây giờ sẽ bị mâu thuẫn bởi những gì bạn sẽ học sau này. Giả sử bạn có một yêu cầu rằng hệ thống của bạn phải có Địa chỉ cho mỗi người. Vì đây là mối quan hệ 1: 1 và dữ liệu sẽ cần trong phần lớn các trường hợp, bạn chỉ cần thêm các trường Địa chỉ vào bảng Person. Một tuần sau, bạn nhận được yêu cầu một Người có thể có nhiều Địa chỉ. Bây giờ, đó là mối quan hệ 1: N và để mô hình hóa chính xác, bạn phải hoàn tác các thay đổi trước đó của mình, tách các trường ra thành một bảng Địa chỉ mới. Đây không phải là thường lệ, đặc biệt là trong số các nhà phát triển cao cấp. Nhà phát triển có kinh nghiệm sẽ thấy rằng một Người có Địa chỉ, coi những người này là riêng biệt về mặt khái niệm và tạo bảng Người và bảng Địa chỉ, liên kết Người với Địa chỉ với tham chiếu FK với Địa chỉ. Một lược đồ như thế này dễ thay đổi hơn nên bản chất của mối quan hệ thay đổi; mà không tạo hoặc xóa toàn bộ bảng dữ liệu "rộng", mối quan hệ giữa Người và Địa chỉ có thể được sửa đổi khá dễ dàng từ 1: 1 thành 1: N thành N: N.


2

Không có quá nhiều sự tập trung vào thiết kế trước khi làm việc dưới Agile, vì vậy tôi không thấy đây là một vấn đề lớn, chắc chắn là cho phiên bản đầu tiên.

Thật khó để bình luận về một hệ thống có 700 bảng tôi chưa từng thấy, nó cũng có thể cần tất cả chúng, nhưng cũng có thể là trường hợp cơ sở dữ liệu chưa được quản lý đủ tốt.

Ngay cả dưới sự nhanh nhẹn, đối với một hệ thống lớn, điều khá phổ biến là vẫn có ai đó / nhóm phụ trách lược đồ.


2

Nếu họ đang thực hiện các thay đổi như vậy thường xuyên - đặc biệt là bỏ các bảng và cột trong các ứng dụng trực tiếp - đó có vẻ như là một dấu hiệu của sự thiếu kinh nghiệm. Nó không có gì để làm với bất kỳ quá trình mà họ đang tuyên bố tuân theo. 'Agile' không phải là lý do để không ngồi xuống và suy nghĩ về dữ liệu bạn cần lưu trữ và cách nó liên quan trước khi bạn bắt đầu viết mã. Nếu họ thấy họ đang thay đổi hơn 10-20% cấu trúc ban đầu, với tôi đó là một chỉ số họ sẽ không suy nghĩ mọi thứ hoặc họ không có nhiều kinh nghiệm phân tích các yêu cầu và thiết kế cơ sở dữ liệu, và vì vậy họ chỉ đơn giản là nhận được nhiều sai lầm khi bắt đầu


2

Mặc dù có vẻ như nhóm của bạn thực sự chỉ đơn giản là mã hóa cao bồi, nhưng thực sự không có gì sai khi tái cấu trúc cơ sở dữ liệu HOẶC cơ sở dữ liệu. Nó không bị mất việc - nó thích nghi với một thực tế mới học được.

Tôi muốn đề xuất những gì nhóm cần là một hộp cát để thử các thay đổi, thực hiện một số thử nghiệm, đưa chúng ra khỏi người dùng và quyết định xem chúng có hợp lý hay không. Tại thời điểm đó, việc tích hợp các thay đổi có ý nghĩa - với thử nghiệm hồi quy thích hợp - vào lược đồ của bạn sẽ ổn.


1

Agile là về mã hóa, Cơ sở dữ liệu không phải là mã. Thay đổi cơ sở dữ liệu nên được xử lý như tu sửa một ngôi nhà. Mọi người bằng cách nào đó có niềm tin rằng nhanh nhẹn có nghĩa là hành động lập kế hoạch sau này, điều này là hoàn toàn sai sự thật. Ngay cả theo phương pháp nhanh, thời gian cần phải được đưa ra để lập kế hoạch, đặc biệt đối với một cái gì đó quan trọng như thiết kế cơ sở dữ liệu.


5
Cơ sở dữ liệu không phải là mã, nhưng lược đồ là và nên được xử lý như vậy. Nó nên được phiên bản và kiểm soát nguồn quá. Tôi muốn hạ thấp điều này nhưng tôi đồng ý quá nhiều với phần còn lại của câu trả lời của bạn.
maple_shaft

6
Agile không phải là về mã hóa. Đó là về quy trình phát triển phần mềm, trong đó chắc chắn bao gồm cơ sở dữ liệu nếu phần mềm hoạt động phụ thuộc vào cơ sở dữ liệu. Có nói rằng, tôi đồng ý với khẳng định của bạn rằng Agile không có nghĩa là 'hành động ngay lập tức lên kế hoạch sau'.
Eric King

@maple_shaft chỉ vì một lược đồ db được xử lý như mã không làm cho nó thành mã. thú cưng được đối xử như mọi người, nhưng nó không biến chúng thành người
Ryathal

3
Cho dù một cái gì đó là mã hay không, nó cần phải được lên kế hoạch. Thay đổi cơ sở dữ liệu nên được xử lý như thay đổi mã cùng với các cân nhắc cho dữ liệu hiện có. Nó thực sự cần nhiều suy nghĩ và lập kế hoạch.
Jeff

1

Công việc cuối cùng của tôi là ở một đội như thế này. Khi sử dụng một yêu cầu quá trình nhanh nhẹn thay đổi. Đôi khi các thay đổi có nghĩa là một thực thể hiện tại cần một thuộc tính mới dẫn đến một cột mới trong một bảng hiện có hoặc một thực thể hoàn toàn mới được yêu cầu dẫn đến một bảng mới có mối quan hệ với các bảng hiện có. Những loại thay đổi này đi kèm với lãnh thổ và không thể bỏ qua chỉ vì bạn không muốn chạm vào lược đồ. Thành công được xác định bằng cách duy trì tính toàn vẹn của dữ liệu của bạn khi di chuyển từ một phiên bản cơ sở dữ liệu sang thử nghiệm đơn vị phù hợp và tiếp theo.

Chỉ cần cố gắng không thực hiện các thay đổi không cần thiết cho lược đồ của bạn. Ví dụ: nếu một tính năng yêu cầu tạo bảng mới, hãy đảm bảo bạn hài lòng với định nghĩa của bảng đó trước khi bạn kiểm tra và đưa nó ra môi trường thử nghiệm của bạn. Phải hoàn tác một thay đổi đối với lược đồ cơ sở dữ liệu của bạn sau khi dữ liệu của bạn đã được di chuyển có thể gây đau đớn.

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.