2010-07-12 4 views
2

В нашем приложении для недвижимости есть таблица событий, которая исторически была связана с таблицей Homes через столбец Event.homes_id.MySQL/CakePHP DB Design Вопрос

В последнее время мы добавили тип события, который не связан с домом, а с риэлтором. Вопрос: правильно ли теперь добавить столбец realtor_id в таблицу Events? Что-то во мне восстает в идее наличия двух столбцов, home_id и realtor_id для каждой записи, одна из которых всегда будет нулевой для любой записи. Мой босс говорит, что он эффективен и позволяет избежать накладных расходов на создание новых таблиц. Каковы права и недостатки этой ситуации?

. Следствие к вышеуказанному вопросу: часть нашего нежелания создавать новые таблицы - это тот факт, что мы используем CakePHP, и поэтому становится сложнее иметь абсолютный контроль над несколькими связанными таблицами через соединения SQL. (Устанавливает рекурсивное свойство Cake для максимального уменьшения скорости приложения до обхода.) Нужно ли и должно ли работать с Cake влиять на дизайн базы данных? Или мы просто работаем с Cake неправильно?

+0

Я чувствую вашу боль при рекурсивных бедах CakePHP. Мне нравится фреймворк, но он может действительно уйти от вас, если вы не смотрите его. Это, как говорится, когда вы узнаете о радостях ad-hoc-соединений в ваших вызовах CakePHP, вам будет легче работать. – Stephen

+0

Спасибо, ребята, за некоторые действительно интересные ответы на вопрос, охватывающие обе стороны аргументации - прагматизм против того, чтобы делать вещи оптимальным способом. Мы закончили тем, что придерживаемся прагматичного (углового?) Маршрута - будем надеяться, что он не укусит нас позади в будущем! – thesunneversets

ответ

2

Что-то во мне восставших на идее с двумя колоннами, home_id и realtor_id для каждой записи, один из , который всегда будет нулевым для любого данной записи. Мой босс говорит, что он эффективен и позволяет избежать накладных расходов , создавая новые таблицы. Каковы прав и зло в этой ситуации?

Ну, вы правы, он, вероятно, менее эффективен, чем оптимальный. Однако добавление другого столбца (INT, не менее), который будет равен нулю в течение 50% времени, не повлияет на общую эффективность базы данных.

OTOH, вам потребуется немного усилий для реструктуризации вашего приложения. Просто добавив этот столбец, вы эффективно взломаете.

Я думаю, что это приемлемо для этой ситуации, хотя вам может и не понравиться эстетика. Эй, никто не любит хаки. Это увеличивает «технический долг». Но google для этого термина, и вы увидите, что многие люди говорят об этом техническому долгу, потому что он позволяет вам продолжать двигаться вперед, вместо того, чтобы пытаться обнулить идеальное решение (что позволит вам избежать, несмотря на лучшие усилия).

Это бизнес-решение - это эстетика вашей схемы и кодовой базы, которая стоит затрат (ваша часовая ставка * # часов, чтобы «правильно» исправить ее)? В этой ситуации я бы сказал, что это, вероятно, нет.

+0

Это правда, что все действительно работает прямо сейчас, и, может быть, я просто должен быть благодарен за это! Тем не менее, будучи очень младшим программистом в великой схеме вещей, я всегда хочу быть уверенным, что я не совершаю слишком много преступлений против лучшей практики ... всегда хорошо, чтобы пробежать мимо комбинированной мудрости Интернета! – thesunneversets

+0

+1 для технического долга и продвижения философии. –

+0

Создание технического долга без уважительной причины почти всегда вернется и укусит вас в задницу позже. – Kalium

2

Мой босс говорит, что он эффективен и позволяет избежать накладных расходов при создании новых таблиц.

Это поражает меня, как будто. Я думаю, вам нужен другой дизайн.

В частности, я хотел бы рассмотреть возможность проведения мероприятий, принадлежащих Homes and Realtors. Реорганизуя это, вы избегаете вопроса о том, что один-два идентификатора имеют смысл. Я бы представлял Realtors/Homes to Events, как has_many, и обратное, поскольку множественные отношения принадлежат к отношениям, если вам это действительно нужно.

+0

+1 Если новые таблицы накладные, я не могу представить, что он назвал бы обручами, с которыми вы должны прыгать, чтобы выяснить, связано ли данное событие с домом или риэлтором при каждом его получении. Настройка мощности ваших отношений потребует некоторой работы по переносу ключей, но должна быть легкой для остальной части срока действия приложения. –

+0

Это не слишком сложно найти все из событий «где home_id = n» или «где realtor_id = n», в любом случае, но я рад, что люди разделяют мои интуиции, что это грязно. У меня возникли проблемы с визуализацией процесса реорганизации отношений: какие столбцы other_table_id будут по-прежнему необходимы в таблице Events? – thesunneversets

+0

Под схемой я предложил, нет. – Kalium

1

«мы используем CakePHP, и поэтому становится сложнее иметь абсолютный контроль» - Почему?

Что вы теряете, добавив еще один столбец? Не много. Гордость, может быть. Все приложения имеют компромиссы где-то, и это крошечный.

(Установка рекурсивного свойства Cake для максимального уменьшения скорости приложения до обхода.) "- тогда не использует рекурсивный! Контейнерное поведение делает гораздо лучшую работу, и вы можете получить только данных, которые вы хотите, но насколько вам нужно.

Я бы добавил еще один столбец, оптимизированный с возможностью сдерживания и переход на более важные вещи.

+0

Wow, Containable выглядит * невероятно * полезно. То, что они не всегда говорят вам, когда вы только начинаете с CakePHP ... – thesunneversets