Причины для и против базы данных - PullRequest
1 голос
/ 12 апреля 2010

У меня была дискуссия с коллегой об архитектуре программы, которую я пишу, и мне хотелось бы еще несколько мнений.

Ситуация:

  • Программа должна обновляться почти в реальном времени (+/- 1 минута).
  • Включает перемещение объектов в системе координат.
  • Есть некоторые события, которые происходят через равные промежутки времени (то есть создание объектов).
  • Движения могут измениться в любое время через пользовательский ввод.

Мое решение было:

  • Создайте сервер, который работает непрерывно и хранит данные внутри.
  • Сервер регулярно выводит состояние программы для защиты от сбоев питания и / или сбоев.

Он утверждал, что программе требуется база данных, и я должен использовать cronjobs для обновления данных. Я могу хранить информацию о движении, сохраняя начальную точку, конечную точку и скорость, и обновлять положение в cronjob (и вычислять столкновения с другими объектами там), вычисляя направление и скорость.

Его причины:

  • Требуется больше процессора и памяти, потому что он работает постоянно.
  • Сбои питания / Сбои могут уничтожить данные.
  • Базы данных быстрее.

Мои причины против этого в основном:

  • Не очень точно, поскольку события могут происходить только в полные минуты (хотя это не так уж и плохо).
  • Требуется (возможно, дорогостоящее) преобразование данных при каждом запуске из реляционных данных в объекты.
  • СУБД - это общее решение для специализированной проблемы, поэтому специализированное решение должно быть более эффективным.
  • Сбои питания (или другие сбои) могут оставить Данные в неопределенном состоянии с только частично обновленными данными, если (возможно, дорогостоящие) меры предосторожности (такие как транзакции) не приняты.

Что вы думаете об этом?
Какие аргументы вы можете добавить для любой стороны?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2010

Базы данных не быстрее. Как глупо ... Как база данных может быть быстрее, чем написать пользовательскую структуру данных и сохранить ее в памяти ?? Базы данных являются обобщенными инструментами для сохранения данных на диске для вас, поэтому вам не нужно писать весь код, чтобы сделать это самостоятельно. Потому что они должны удовлетворять потребности многочисленных разрозненных (а иногда и противоречивых) бизнес-функций (постоянство (долговечность), целостность транзакций, кэширование, целостность отношений, атомарность и т. Д. И т. Д.) И делают это таким образом, чтобы защитить разработчика приложения приходится так сильно беспокоиться об этом, по определению это будет медленнее. Это не обязательно означает, что его заключение неверно.

Каждое из его других возражений можно устранить, написав код для решения этой проблемы самостоятельно ... Но вы видите, к чему это идет ... В какой-то момент усилия по разработке пользовательского кода для решения проблем, которые важны для вашего приложения, перевешивают снижение производительности от простого использования базы данных - которая уже делает все это из коробки ... Сколько из этих проблем важно? а знаете ли вы, как написать код, необходимый для их решения?

1 голос
/ 12 апреля 2010

Из того, что вы описали здесь, я бы сказал, что ваше решение кажется лучшим вариантом. Вы говорите, что это запускается раз в минуту, но сколько времени это займет, чтобы бежать? Если всего несколько секунд, то преобразование в реляционные данные, скорее всего, будет несущественным, как и любые другие издержки. большая часть этого займет, вероятно, 30 секунд. Это предполагает, опять же, что программа довольно мала.

Однако, если он больше и предполагает, что он станет больше, лучше сделать прямой сброс. Возможно, вы не захотите делать полный дамп при каждом запуске, но это зависит от вас, просто помните, что он может занять много места (то же самое происходит, если вы используете базу данных).

Если вы собираетесь сбросить состояние, вам понадобится какая-то система резервирования вместе с квази-транзакциями. Вы хотели бы сохранить несколько копий на случай, если что-то случится с новейшей версией. Скажем, питание отключается, пока вы храните, и у вас нет резервных копий, кроме этого наполовину написанного. Транзакции, вам нужно что-то, чтобы сказать, что файл полностью записан, поэтому, если что-то пойдет не так, вы всегда можете сказать, что было последним успешным сохранением.

О, и за его аргумент о том, что он работает постоянно: если у вас установлен cronjob, или даже самозаключенный оператор сна или что-то подобное, он не использует процессорное время, когда он не работает, столько же что было бы, если вы используете СУБД.

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

Резюме: База данных - это хорошая идея, если у вас много простоя процессорного времени или хронологических записей, но если ресурсы представляют собой законную проблему, то это может привести к чрезмерным накладным расходам, и лучше будет выполнить дамп с принятыми мерами предосторожности.

0 голосов
/ 12 апреля 2010

MySQL теперь может моделировать пространственные данные.

http://dev.mysql.com/doc/refman/4.1/en/gis-introduction.html

http://dev.mysql.com/doc/refman/5.1/en/spatial-extensions.html

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

...