저는 PHP 코드를 사용하는 웹 응용 프로그램을 만들고 MySQL은 저장소 엔진을 사용하고 있습니다. 내 데이터 모델을 작업 할 때 '기본'데이터를 처리 할 때 약간의 문제가 있음을 깨달았습니다.기본값은 어디에 두어야합니까?
기본값을 포함하도록 MySQL 스키마를 설계했는데, 대부분의 경우 손으로 데이터를 조작했기 때문에 당시에는 의미가있었습니다. 나중에 다른 사람이 변경할 수 있도록 제어판을 추가하는 데 1 년이 걸렸습니다. 자료.
문제는 일부 개체에 필요한 '기본'값을 처리하는 방법이됩니다. 기술적으로, 'null'을 남겨 두는 것도 기본값이지만, 지금까지는 특별히 걱정스럽지 않았습니다.
MySQL 기본값을 사용하는 경우 새 값을 삽입하면 즉시 돌아 서서 데이터베이스에서 '실제'데이터를 가져와야합니다. 반면 PHP에서 기본값을 설정하면 두 곳에서 기본값을 사용하여 DRY를 위반하기 시작합니다. 그리고 누군가가 '빠른'수정을 한 장소에서 변경하면 꽤 재미있는 버그로 디버깅 할 수 있습니다. 동시에, 데이터 스키마의 일부이기 때문에 MySQL에서 기본값을 제거 할 수 없기 때문에이 스키마에 남겨 둘 필요가 있습니다.
나는 뭔가를 내려다 보거나 잘못된 가정을 어딘가에 내기를 기꺼이 하겠지만, 나는 그것이 무엇인지 모릅니다. 누구든지 이것을 처리하는 방법에 대한 조언이 있습니까?
편집 : 명확성을 위해
, 내 PHP 코드의 라인을 따라 뭔가 수 있습니다 :
$foo = new foo();
//Add in instance-specific data
$foo -> save;
푸의 다음 쿼리 실행됩니다 방법을 저장합니다
INSERT INTO FOO (bar1, bar2)
VALUES (:bar1, :bar2)
그러나 해당를 Foo가 사용하는 (많은) 변수 중 2 개를 삽입합니다. 이 모든 것이 나를 '기본'상태로 설정합니다. 지금이 순간, 나는 다음 실행해야합니다 :
$foo= Foo::getFooWithId($foo->id); //I know I should use a DBA; this is legacy code
그리고 $ foo는이 다음 데이터베이스에 설정되어있어 데이터로 채워집니다. E. G. bar3과 bar4는 처음에 객체를 만들 때 설정되지 않은 기본값을 가지고 있습니다. 사용자가 나중에 원할 경우 변경할 수 있지만 '기본'객체의 일부가 아닙니다.
기본값을 PHP로 옮겨야합니까? MySQL에 남겨두고 꺼내십시오. 두 곳에 다 넣어서 DRY를 위반합니까? 아니면 네 번째, 더 나은 옵션을 놓치고 있습니까?
이 질문을 던지면 다음과 같은 질문을하게됩니다. 그러나 마스터 값 테이블을 사용하여 스키마의 필드 기본값을 설정하여 응용 프로그램에서 SELECT 및 INSERT/UPDATE 작업에 대해 항상 참조 할 수 있습니다. ? 나는 이것을 알고 싶어 할지도 모른다. 외래 키가 정말로 관계형 일 필요가 있다면 문제가됩니까? – cerd
기본 생성자에서 개체를 채 웁니다. –