데이터베이스 업그레이드 - 좋은 방법인가요, 나쁜 방법인가?
Upsert(존재하는 경우 삽입 또는 업데이트) 절차가 데이터베이스 프로그래밍에서 잘못된 관행으로 간주되는지 여부에 대한 통찰력을 찾습니다.관련성이 있다면 SQL 서버에서 일하고 있습니다.
몇 달 전 제가 일했던 곳에서 상주 DB 구루는 새로 작성된 DB 코딩 표준(대부분 동의함)에서 업버트를 피해야 한다고 말했습니다.
저는 이것에 대한 논리적인 이유를 잘 알 수 없고, 좋은 프로그래밍 연습을 의식하고 있다고 생각합니다.직접적인 데이터 관리에 유용하고 과도한 저장 프로시저 번호를 피하는 데 도움이 된다고 생각합니다.
이 문제에 대한 결론을 내리는 데 도움이 될 통찰력/토론을 찾고 있습니다.
감사해요.
의견에 대한 응답으로 업데이트:
제가 언급하는 구체적인 컨텍스트는 데이터베이스에서 도메인 엔티티 데이터 표현의 작성 또는 업데이트입니다.예를 들어, "사용자" 오브젝트가 데이터베이스에 "사용자" 테이블의 표현으로 존재한다고 가정합니다.새 사용자를 만들거나 기존 사용자를 업데이트하기 위한 메커니즘이 필요합니다.여기서는 Upsert 저장 프로시저를 만들 수도 있고, Update용과 Insert용으로 두 개의 별도 저장 프로시저를 만들 수도 있습니다.
어떤 관점에서 장점이나 단점이 있습니까?
키로 선택한 레코드가 중복되므로 새 레코드를 추가하려는 경우 기존 레코드를 덮어쓰는 것이 주요 문제입니다.예를 들어 로그인 이름을 말합니다.로그인이 존재하므로 로그인이 중복된다는 오류를 해결해야 할 때 업데이트합니다.
두 번째 문제는 삭제된 레코드를 부활시키는 것입니다.프로세스 "A"가 레코드를 쿼리하고 프로세스 "B"가 레코드를 삭제한 다음 프로세스 "A"가 변경사항을 제출한다고 가정합니다.삭제하려던 레코드는 이제 "A"에게 삭제된 예외를 전달하는 대신 데이터베이스로 돌아갑니다.
저는 일부러 프로그래밍하는 것을 좋아합니다.
무언가를 만들고 있거나, 이 경우 이미 엔터티가 있는 경우 삽입이 실패(중복)하기를 원합니다.또는 내가 알고 있는 것을 업데이트하고 있는데, 이 경우 업데이트가 실패하기를 원합니다(실제로는 그렇지 않습니다).
상승/합병하면 이것은 약간 모호해집니다.제가 성공했나요, 실패했나요?제가 부분적으로 성공했나요?행에 있는 값 중 일부는 (삽입에서) 내 값이고 일부는 이전에 존재했습니까?
그렇다고는 해도, 업서트는 유용하고(그래서 처음부터 시행된 것이다), 그것들을 금지하는 것은 어리석은 일일 것입니다.그것은 범죄자들이 경찰로부터 도망치기 위해 도로를 이용하기 때문에 도로를 금지하는 것과 같습니다.불안이 일을 하는 유일한 방법인 경우는 무한히 많습니다.그리고 시스템 간 데이터 동기화 작업을 해본 사람이라면 누구나 이 사실을 알고 있습니다.
당신이 무슨 말을 하는지에 따라 다릅니다.데이터? 글쎄요, 그것은 데이터 조작 과정에 의해 결정됩니다. 아니면?OR 업데이트가 필요하면 삽입해야 합니다. 스키마 개체에 대한 것이라면 유사합니다.
두 프로세스의 첫 번째 예(두 번째 프로세스가 동일한 키를 가진 새 레코드를 추가하여 삭제된 레코드를 "재설정"하는 경우)에서 이의 제기는 설계 불량으로 인한 특정 사례에서만 유효합니다. 또는 "업버트" 절차가 동일한 키 또는 두 개의 별도 절차로 레코드를 작성한 경우에 관계없이 발생합니다.삽입된 레코드를 작성했습니다.
동일한 키를 피해야 하는 경우 자동 증분 ID 키가 삽입에 사용됩니다.동일한 키를 피할 필요가 없는 경우, "팬텀 조인"을 만들지 않도록 우수한 데이터베이스 설계를 구현해야 합니다.예를 들어, 통신 세계에서 전화 번호는 종종 재사용되며 "고유한" 키입니다.#2 사용자가 전화 번호를 "상속"할 수 있지만 #1 사용자의 연체된 미지급 요금이나 통화 내역 등을 "상속"해서는 안 되기 때문에 기본 키가 될 수 없습니다.따라서 기본 키와 서비스 날짜 또는 기타 고유 식별자를 자동으로 증분하는 조합을 사용하여 잘못된 데이터 체인을 방지할 수 있습니다.
언급URL : https://stackoverflow.com/questions/4508005/database-upserts-good-or-bad-practice
'programing' 카테고리의 다른 글
| 파이썬에서 HTML을 탈출하는 가장 쉬운 방법은 무엇입니까? (0) | 2023.07.13 |
|---|---|
| Windows MongoDB - 나침반이 설치되었지만 시스템에서 나침반을 찾을 수 없습니다. (0) | 2023.07.13 |
| C#에서 이중을 가장 잘 나타내는 SQL 서버 데이터 유형은 무엇입니까? (0) | 2023.07.13 |
| 절차를 "끊을" 방법이 있습니까? (0) | 2023.07.08 |
| v-for 루프의 요소에 클래스를 추가하는 중 (0) | 2023.07.08 |