2013-08-10 6 views
2

Я работаю над веб-приложением, которое использует PHP для его кода, и MySQL для его механизма хранения. При работе над моей моделью данных я понял, что у меня небольшая проблема с обработкой данных «по умолчанию».Где я должен поместить свои дефолты?

Я разработал схему MySQL для включения значений по умолчанию, что имело смысл в то время, потому что я в основном манипулировал данными «вручную» - через год мы собрались добавить панель управления, чтобы другие изменяли данные.

Проблема заключается в том, как обрабатывать значения по умолчанию, необходимые для некоторых объектов. Технически, оставляя вещи «null», также является дефолтом, но я не был особенно обеспокоен этим раньше.

Если я использую значения по умолчанию MySQL, когда я вставляю новое значение, я должен немедленно развернуться и запросить его, чтобы получить «реальные» данные из базы данных. Если, с другой стороны, я установил свои значения по умолчанию в PHP, я начинаю нарушать DRY, имея значения по умолчанию в двух местах. И если кто-то когда-нибудь сделает «быстрое» исправление и изменит их только в одном месте, я могу завершить некоторые интересные «интересные» ошибки для отладки. В то же время я не могу удалить значения по умолчанию из MySQL, потому что они действительно являются частью схемы данных и должны быть оставлены в ней.

Я готов поспорить, что я либо что-то пропускаю, либо делаю недопустимое предположение где-то, но я не знаю, что это такое. У кого-нибудь есть рекомендации относительно того, как с этим справиться?

Edit:

Для ясности, мой PHP код может быть что-то вдоль линий:

$foo = new foo(); 
//Add in instance-specific data 
$foo -> save; 

Foo Сохраним метод затем выполнить запрос:

INSERT INTO FOO (bar1, bar2) 
VALUES (:bar1, :bar2) 

Но это только вставляет 2 из (многих) переменных, которые использует Foo. Все это делает меня в состоянии «по умолчанию». На данный момент, я тогда должен бежать:

$foo= Foo::getFooWithId($foo->id); //I know I should use a DBA; this is legacy code 

и $ Foo затем заполняется данными, которая была создана в базе данных. E. G. bar3 и bar4 имеют значения по умолчанию, которые не заданы при первом создании объекта - пользователи могут впоследствии их изменить, если они захотят (и, вероятно, будут), но они не являются частью объекта «по умолчанию».

Должен ли я переместить эти значения по умолчанию в PHP? Оставьте их в MySQL и вытащите из него? Нарушить СУХО, помещая их в оба места? Или я пропустил четвертый, лучший вариант?

+0

Отбрасывание этого вопроса: это вызывает у меня проблемы: но можете ли вы использовать таблицу основных значений для установки значений по умолчанию для полей в вашей схеме, чтобы приложение всегда могло ссылаться на нее как для операций SELECT, так и для INSERT/UPDATE ? Мне было бы интересно узнать об этом. Иностранные ключи - проблема, если она должна быть действительно реляционной, я полагаю? – cerd

+0

Я бы заполнил объект их в конструкторе по умолчанию. –

ответ

1

Вы не представили нам примерный запрос, но я буду считать, что не так.

Если вы пишете свои вставки в PHP таким образом, что опускаете элементы, которые имеют значения по умолчанию, MySQL возьмет на себя и добавит их для вас.

Итак, скажем, у вас есть стол с колоннами id, user и comment. Предположим, что значение comment имеет значение по умолчанию. Я хочу сказать, что вы можете сделать запрос вставки, в котором вы должны указать только id и user (или, вероятно, только user, если id является основным индексом автоматического инкремента), а comment автоматически получит значение по умолчанию вы установили в своем определении таблицы.

EDIT

Независимо работает лучше всего для вашего дизайна приложений, на самом деле ... Посмотрите, где они будут использоваться наиболее и держать их там.

Но одно правило, которым я бы воспользовался: не имеет значений по умолчанию в более чем одном месте, особенно если они перекрываются (в отличие от расширения).

+1

Я не думаю, что это то, о чем спрашивает ОП. Я думаю, что он просит лучших практик в отношении того, где найти фактические значения по умолчанию для cols, если он не хочет полагаться на их размещение в схеме для целей своего приложения. – cerd

+0

@cerd Возможно, вы правы, я удалю его, если это не поможет OP. – Shomz

+1

@RonLugge см. Мой первый комментарий, если это то, о чем вы спрашиваете (короче говоря), вы можете изменить для ясности - я смог получить суть, но ваш q требует чтения пару раз. – cerd

Смежные вопросы