2009-04-19 5 views
20

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

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

Лично я ненавижу сериализации, потому что:

  1. Данные, сохраненные приклеен только платформы разработки (C# в моем случае). Эти данные не могут использовать никакие другие платформы, такие как Java или C++.
  2. Сохраняется весь граф объекта (включая всю цепочку наследования), а не только нужные нам данные.
  3. Изменение модели данных может привести к серьезным проблемам с обратной совместимостью при попытке загрузить старые состояния.
  4. Разделение частей данных между приложениями проблематично.

Я хотел бы услышать ваше мнение об этом.

ответ

3

См. this Stackoverflow posting для комментария о применимости XML и применимости системы управления базами данных. В нем обсуждается проблема, которая очень похожа на тему дебатов в вашей команде.

3

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

  1. Ну, вы всегда можете написать конвертер на C#, чтобы извлечь данные позже, если это необходимо.

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

  3. Это путь мира. Сжечь мосты и потребовать обновления. Преобразуйте данные или создайте инструмент для этого, а затем больше не поддерживайте способ выполнения старой версии.

  4. Не, если программа C# передает данные другим приложениям. Другие приложения не должны получать доступ к данным, которые принадлежат этому приложению, если они?

2

Для передачи и автономного хранения сериализация в порядке; но для активного использования какая-то база данных предпочтительнее.

Обычно, как вы говорите, без базы данных вам необходимо десериализовать весь поток для выполнения любого запроса, что затрудняет его масштабирование. Добавьте неотъемлемые проблемы с потоками и т. Д., И вы просите о боли.

Некоторые из ваших других болевых точек о сериализации не все верно - пока вы выбираете разумно. Очевидно, BinaryFormatter является плохим выбором для portability and versioning, но «protocol buffers» (формат сериализации Google) имеет версии для Java, C++, C# и lot of others и предназначен для толерантности к версии.

8

Это зависит от того, что вы хотите сериализовать, конечно. В некоторых случаях сериализация смехотворно проста.

(Я как-то написал программу временной шкалы в Java, , где вы могли бы нарисовать en, перетащить и изменить размер объектов. Если вы были готовы, вы можете сохранить его в файле (например, myTimeline.til). объекты, где сохраняются, их положение на холсте, их размер, их цвета, их innertexts, их спецэффектами, ...

Вы могли бы чем открыть myTimeLine.til конечно и работать дальше.

Все это только просил a несколько строк кода. (просто сделали все классы и их зависимости сериализуемыми) и мое время кодирования менее 5 минут, я был поражен собой! (это был первый раз, когда я использовал сериализацию когда-либо)

Работая на временной шкале, вы также можете «сохранить» для разных версий и файлов «til», где очень просто сделать резервную копию и почту.

Я думаю, что в моем конкретном случае было бы немного идиотом использовать базы данных. Но это, конечно, только для документов-подобных структур, например Word, чтобы назвать их.)

Моя точка, таким образом, первая: есть, конечно, несколько сценариев, в которых базы данных не будут лучшим решением. Сериализация не была изобретена разработчиками только потому, что им было скучно.

  1. Не верно, если вы используете XMLserialization или SOAP
  2. Не совсем актуален больше
  3. Только если вы не осторожны, много «лучшие практики» для этого.
  4. Только если вы хотите, чтобы это было проблематично, см 1

Конечно сериализации имеет помимо скорости выполнения других важных преимуществ, как не нуждаясь в базу данных вообще в некоторых случаях!

15

Вы не указали, какие данные это - многое зависит от вашей производительности, одновременности, установки, безопасности и доступности/требований к централизации.

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

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

  • Если ваше приложение имеет собственную установку на суп-орехе, использование базы данных создает дополнительную нагрузку для пользователя, который должен настроить и поддерживать (применять исправления и т. Д.) Сервер базы данных. Если база данных может быть гарантирована и доступна кому-то другому, это не проблема.

  • Каковы требования безопасности для данных?Если данные централизованы, то с несколькими пользователями (одновременно или последовательно) вам может потребоваться управлять безопасностью и разрешениями на данные. Не видя данных, трудно сказать, будет ли проще управлять с постоянством на основе файлов или с базой данных.

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

Я думаю, что вы, вероятно, не нужна база данных, основываясь исключительно на том, что вы просите об этом, главным образом, с точки зрения программирования, удобство, а не перспектива-требования к данным. Сериализация, особенно в .NET, очень настраивается и может быть легко адаптирована для сохранения только необходимых элементов. Есть well-known best practices для версий этих данных, поэтому я не уверен, что есть преимущество на стороне базы данных с этой точки зрения.

О кросс-платформенных проблемах: Если вы не знаете для определенного, то в будущем потребуется кросс-платформенная функциональность, не создавайте для нее сейчас. Почти наверняка легче решить эту проблему, когда придет время (миграция и т. Д.), Чем ограничить ваше развитие сейчас. Чаще всего, YAGNI.

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

+0

Отличный ответ !!! –

1

Просто убедитесь, что у вас есть компонент, который обрабатывает состояние сохранения/загрузки с чистым интерфейсом для остальной части вашего приложения. Тогда любой выбор, который вы делаете для настойчивости, может быть легко пересмотрен позже.

Сериализация графического объекта в файл может быть хорошим быстрым и грязным первоначальным решением, которое очень быстро реализуется.

Но если вы начнете сталкиваться с проблемами, которые делают базу данных лучшим выбором, вы можете подключить новую версию, практически не влияющую на остальную часть приложения.

0

Да, возможно, верно. Недостатком является то, что вы должны получить весь объект, похожий на извлечение всех строк из таблицы. И если он большой, это будет недостатком. Но если он не такой большой, и с моими хобби-проектами это не так, может быть, они должны быть идеальным матчем?

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