Có bất cứ lúc nào chúng ta nên tránh xóa tầng?


11

Trong SQL Server 2008, có một bảng Chính được liên kết với ba bảng con khác từ 1 đến nhiều mối quan hệ. Vì vậy, chúng tôi đang nghĩ đến việc sử dụng Cascading xóa trong bảng chính, để tất cả các bản ghi trên bảng con sẽ bị xóa khi bản ghi từ bảng chính bị xóa.

  1. Vì vậy, tầng có xóa một lựa chọn chính xác ở đây?
  2. Khi nào thì không nên sử dụng Detele tầng?

3
Không ai có thể trả lời điều này mà không biết trường hợp sử dụng của bạn. Xóa tầng luôn có nguy cơ dữ liệu bị xóa dễ dàng. Về cơ bản tôi sử dụng nó rất hiếm khi, trong trường hợp đây là hành vi mong muốn. Đây là những bảng sửa đổi rất nhiều nói chung.
dezso

Câu trả lời:


17

Tôi thường cảnh giác với việc xóa tầng (và các hành động tự động khác có thể làm rơi / làm hỏng dữ liệu), thông qua các trình kích hoạt hoặc ON <something> CASCADE. Các cơ sở như vậy rất mạnh mẽ, nhưng cũng có khả năng nguy hiểm.

  • Vì vậy, tầng có xóa một lựa chọn chính xác ở đây?

Nó chắc chắn sẽ làm những gì bạn đang tìm kiếm để làm: xóa các bản ghi liên quan khi bản ghi cha bị xóa, mà bạn không cần phải thực hiện bất kỳ logic nào khác để đảm bảo rằng trẻ em bị xóa trước do đó làm cho mã của bạn ngắn gọn hơn. Tất cả các hành động sẽ được gói trong một giao dịch ngầm, vì vậy nếu một thứ gì đó chặn đứa trẻ xóa toàn bộ hoạt động sẽ bị chặn, duy trì tính toàn vẹn tham chiếu với ít hoặc không cần thêm nỗ lực mã hóa.

Hãy chắc chắn rằng việc bạn sử dụng xóa tầng và các hành động "đằng sau hậu trường" khác được ghi lại rõ ràng để những người bảo trì hệ thống trong tương lai nhận thức đầy đủ về nó.

  • Khi nào thì không nên sử dụng Detele tầng?

Nó không nên được sử dụng nếu bạn bị hoang tưởng như tôi! Một điểm quan trọng cần xem xét là các nhà phát triển khác hiện đang hoặc có thể trong tương lai sẽ làm việc với mã / cơ sở dữ liệu của bạn (do đó nhận xét ở trên về việc ghi lại bất kỳ hành vi "ẩn" nào).

Kinh nghiệm của tôi là khá phổ biến đối với những người chưa có kinh nghiệm sử dụng DELETEsau đó INSERTđể cập nhật các hàng, đặc biệt khi những gì họ thực sự muốn là MERGE/ UPSERTthao tác (cập nhật các hàng hiện có và tạo một hàng mới với một hàng có khóa cụ thể không tồn tại) và DBMS không hỗ trợ hợp nhất / upert (hoặc họ không biết về hỗ trợ của nó). Nếu không có các hành động xếp tầng thì điều này hoàn toàn an toàn (hoặc sẽ xảy ra lỗi khi nó đe dọa tính toàn vẹn dữ liệu) nhưng nếu ai đó thực hiện điều này cho các hàng trong bảng cha mẹ nơi các FK tham chiếu cóON DELETE CASCADEthiết lập sau đó dữ liệu liên quan sẽ bị xóa do xóa ban đầu và không được thay thế - vì vậy dữ liệu bị mất (không phải ngay cả khi xóa và chèn tiếp theo được gói trong các giao dịch rõ ràng, tầng xảy ra với thao tác xóa - nó sẽ không chờ xem liệu giao dịch có thay thế các hàng trong bảng cha trong các báo cáo tiếp theo không) và tầng có thể tiếp tục thông qua các tàu quan hệ khác (ví dụ: xóa một giám sát viên cao cấp, nhóm của anh ta bị xóa bởi thác, các nhóm của nhóm của anh ta bị xóa bởi thác, tất cả các hồ sơ được theo dõi cho tất cả những người bị xóa theo tầng, ...). Nếu không kích hoạt xếp tầng, bạn sẽ chỉ gặp lỗi ở đây thay vì dữ liệu bị mất âm thầm.


Sẽ có bất kỳ ý nghĩa hiệu suất? Giống như có được một khóa và xóa bằng tay sẽ tốt hơn so với thác?
Ramesh

Tôi sẽ giả định rằng sẽ có rất ít sự khác biệt, giả sử bạn có quy trình thủ công hơn được gói trong một giao dịch rõ ràng mà bạn nên làm cho mối quan tâm nhất quán. Tất cả các phương thức thủ công và tự động (xếp tầng) sẽ bị ảnh hưởng bởi các mức khóa và cách ly một khi tất nhiên đồng thời được xem xét.
David Spillett

4

Tôi đoán câu trả lời sôi lên cho dù có hay không có ý nghĩa cho tình huống của bạn, nó phụ thuộc . Đối với tình huống của bạn, liệu các hàng trong bảng 'con' có còn ý nghĩa nếu các hàng 'chính' tương ứng của chúng đi không? Dữ liệu trong bảng con sẽ vô nghĩa nếu không có cha mẹ? Nếu vậy, xóa tầng sẽ thực thi tính toàn vẹn tham chiếu. Bạn có thể muốn giữ các hàng con dưới dạng bản ghi, một kho lưu trữ các hoạt động trong quá khứ (mặc dù có khả năng bạn có thể viết các hàng này vào một bảng khác đặc biệt cho mục đích này).

Một ví dụ tôi sử dụng để minh họa điểm này là mối quan hệ bác sĩ / bệnh nhân. Một doc có thể có nhiều bệnh nhân. Một bệnh nhân chỉ có thể là bệnh nhân nếu họ có bác sĩ. Nếu tài liệu đi (rời khỏi thực hành) thì điều gì đó phải xảy ra với các bệnh nhân còn lại. Một khả năng là họ bị thanh trừng. Một cái khác là giá trị mặc định thay thế cho tham chiếu doc ​​hoặc chúng có thể bị xóa khỏi bảng chính và được đặt ở một nơi khác. Mặt khác, không có hoạt động nào xảy ra và bệnh nhân vẫn như cũ, không bị ảnh hưởng, như thể tài liệu vẫn còn hiện diện. Nó phụ thuộc vào những gì bạn muốn làm.

Từ kinh nghiệm cá nhân hãy suy nghĩ cẩn thận về thiết kế cơ sở dữ liệu. Tuần này tôi đã phải thực hiện một cuộc thanh trừng các hồ sơ mồ côi trong một cái bàn chỉ vào hư không và thực sự chiếm không gian.


Tôi phải xóa hồ sơ con khi hồ sơ cha mẹ đi.
Ramesh

Nếu các bản ghi phải hoàn toàn và chúng không có ý nghĩa gì để giữ, thì việc xóa tầng sẽ có ý nghĩa hơn trong tình huống của bạn
the_good_pony

3

Sử dụng xóa tầng là vấn đề sở thích cá nhân, như có nên đặt tên bảng với tên số nhiều hay không (Khách hàng so với Khách hàng).

Tôi muốn không bao giờ sử dụng xóa tầng. Một số thiết kế cơ sở dữ liệu tránh xóa tất cả. Có một vài lời biện minh để xóa dữ liệu khỏi cơ sở dữ liệu khi dung lượng đĩa quá rẻ. Một số thiết kế cơ sở dữ liệu đặt trường bổ sung "IsDelatted" thay vì xóa dữ liệu.

Nếu bạn phải xóa dữ liệu thì sử dụng các thủ tục được lưu trữ để quản lý việc này sẽ giúp bạn kiểm soát và minh bạch hơn. Ứng dụng của bạn có thể thực hiện một thủ tục được lưu trữ sẽ xóa khỏi đứa trẻ sau đó là cha mẹ. Bạn không biết làm thế nào các yêu cầu kinh doanh sẽ thay đổi theo thời gian vì vậy sp sẽ cung cấp cho bạn tính linh hoạt hơn. Đó là 2c của tôi.


Đúng, nó mang lại cho bạn sự linh hoạt hơn, nhưng nó cũng giới thiệu hành vi "ẩn", nghĩa là bạn phải có tài liệu bổ sung cho các sp đó (để ppl biết hành động kinh doanh nào yêu cầu sp) cách khác có thể là hạn chế người dùng sql chỉ có thể thực thi các sp đó và hoàn toàn không thực hiện các bản chèn / cập nhật "đơn giản" khác.
DrCopyPaste
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.