При разработке новой реляционной базы данных обычно каждый тип объекта представляется соответствующей таблицей. Какова наилучшая практика для разработки базы данных, в которой хранится огромное количество различных типов объектов, чтобы избежать создания и обслуживания тысяч таблиц базы данных? Какие лучшие альтернативы реляционной базе данных существуют для этого случая?Какова наилучшая практика для хранения огромного количества (10000+) РАЗНЫХ типов объектов в базе данных?
ответ
Использование базы данных NoSQL (Lucene, Монго, Cassandra, Solr, Elastic поиска, Hadoop и т.д.), в котором хранятся документы , которые могут иметь любое количество полей (думаю, карты ключевых/ценностей). В терминах реляционных баз данных это похоже на то, что каждая «строка» может иметь другое определение строки. Я реализовал именно это в прошлом, и мне было удобно хранить поле class
, чтобы я мог восстановить правильный тип объекта (в моем случае Java, но применим к любому языку).
Вы также можете использовать реляционную базу данных, поддерживающую тип столбца JSON (например, Postgres), а также сериализацию/десериализацию ваших объектов в/из JSON и сохранение их в типизированном столбце JSON. Чтобы сделать удобное решение с одним столом, вам, вероятно, понадобится столбец, в котором хранится тип объекта, чтобы упростить десериализацию. Я также реализовал этот вариант, и это сработало для меня.
Оба варианта хороши. Первая - лучшая технология. Второй может быть менее загадочным, если вы уже знакомы с РСУБД.
Что вы не хотите сделать, это использовать любое ORDBMS решение, где каждый тип объекта имеет специальную таблицу со столбцами соответствующих полей класса. Это болезненно жестко, если вы когда-либо меняете определение своего класса и полностью unscaleae, если число разных классов растет даже очень мало.
Ответ в значительной степени зависит от характера различий между тысячами типов объектов и в какой степени и каким образом их можно классифицировать и, возможно, обобщать дальше. Discovery - это ключ к поддерживаемому дизайну в таких сценариях, как этот.
Ниже приведены некоторые возможные варианты сохранения, которые могут работать для вашего набора типов объектов. Придется подумать, чтобы рассмотреть плюсы и минусы каждого.
- Откройте скрытую структуру или шаблон в типах объектов, позволяя им быть разложен 1,2,3.
- Ознакомьтесь с категориями типов объектов, к которым можно применить (1).
- Сопоставьте несколько объектов с одним или меньшим набором таблиц или типов документов.
- Сопоставьте объекты друг с другом и определите мета-схему для обеспечения их доступности.
Независимо от того, является ли база данных реляционной или нет, как она структурирована, какие типы функций поиска доступны и как реализуются ключи, - это решение, которое должно быть принято после указанного выше обнаружения. Это лучшая практика.
Определение структуры данных таким образом, чтобы данные о сохранении, обслуживании и извлечении не могли получить требуемые характеристики в 500-страничной книге, что, безусловно, не является коротким ответом.
Изучение плюсов и минусов этих потенциальных вариантов было бы хорошим началом.Вы можете искать в Интернете эти философии персистентности по их именам и словам «база данных» или «настойчивость», чтобы увидеть описания и продукты поставщиков, которые соответствуют.
- Реляционной таблица
- Реляционная объект
- Табличные нереляционная
- Картирования (ключ и значение)
- Картирования (ключ и фиксированная полезная нагрузка записи)
- Документа (свободный текст)
- Иерархический
- График (сеть ребер, соединяющих вершины)
- многомерные (OLAP и другие)
Вы можете обнаружить, что причина у вас есть тысячи типов данных является то, что они соответствуют документу типы и единственное, что общее между ними является человеческим языком они написаны или возможно даже не это. Возможно, они являются произвольными языками, и в этом случае интернационализированные системы хранения документов - это варианты для изучения в первую очередь.
Вы можете обнаружить, что существует набор семантических правил, которые подтверждают 9 800 из ваших 10 000+ типов объектов, и в этом случае характеристика и спецификация правил могут привести к более гранулированной схеме хранения 4,5,6. Формализация семантической структуры в сочетании со структурным проектом разработки программного обеспечения (например, шаблон композитора или декоратора) может позволить грубое сокращение количества типов объектов.
Такой рефакторинг может быть полезен во времени и может ускорить ваш проект за небольшую часть времени.
После обнаружения дополнительной структуры вам необходимо будет определить, какой уровень нормализации имеет смысл для ваших требований к хранению, обновлению, извлечению и дискам.
Литература (по всему Интернету) по нормализации и денормализации поможет вам понять компромиссы между пространством, скоростью записи и скоростью чтения 7,8.9. Если каждый день хранится большой объем данных, характеристики ETL также будут значительно влиять на дизайн.
Выбор поставщика и продукта, вероятно, является последним, что вы сделаете в архитектурном отношении, прежде чем начинать разработку и реализацию низкоуровневого дизайна и тестирования. (Это еще одна проблема с таким количеством типов данных. Как вы будете тестировать 10 000 классов соответственно?)
Предоставление вам более узких рекомендаций, чем это было бы безответственным без дополнительной характеристики тысяч типов объектов и почему их так много.
Список литературы
[1] https://www.tutorialspoint.com/design_pattern/design_pattern_quick_guide.htm
[2] https://sourcemaking.com/design-patterns-and-tips
[3] https://sourcemaking.com/design_patterns/strategy
[4] https://www.cs.cmu.edu/~dunja/LinkKDD2004/Jure-Leskovec-LinkKDD-2004.pdf
[5] https://archive.org/details/Learning_Structure_and_Schemas_from_Documents
[7] http://databases.about.com/od/specificproducts/a/Should-I-Normalize-My-Database.htm
[9] https://fenix.tecnico.ulisboa.pt/downloadFile/3779571831168/SchemaTuning.ppt
"Лучшая практика" носит субъективный характер, и часто используется как способ представления личных предпочтений как некогда авторитетный.
Итак, вот мои личные предпочтения ...
Вы должны сделать работу анализа. Является ли ваша реляционная информация - можете ли вы сказать, что существуют сущности и отношения? Если это так - создайте реляционную схему. Возможно, вам придется иметь дело с отношениями наследования - это то, что традиционная реляционная модель не имеет особого отношения, но существует ряд возможных solutions.
Являются ли объекты, которые вы обсуждаете, не очень реляционными? Имеют ли они разные атрибуты, или они состоят в основном из неструктурированных данных? Являются ли отношения прежде всего иерархическими? Вы действительно говорите о временных рядах данных или о географических объектах? В этом случае вам может быть лучше подан один из многих решений NoSQL.
Являются ли данные «read-write» или «read-only»? Вы строите большой репозиторий данных для отчетности и анализа? Если это так, вы можете использовать решение базы данных OLAP/BI, а не реляционную схему.
У вас есть экстремальные требования к масштабируемости или производительности? Если да, то где - читать, писать, анализировать? Если это так, вам может потребоваться рассмотреть сильно денормализованную модель данных.
уверен, когда вы говорите, 10000 + типы объектов, она выходит за рамки примитивных типов, например целое, плавать и т.д., и даже сложные известные типы, как граф и т.д.
Вы не можете использовать реляционную базу данных, как, например, хранение простой график потребует разработки пользовательских отношений и таблиц. Таким образом, единственным возможным вариантом является использование Key-Value базы данных NoSQL, где любой тип объект будет сериализовать в документ и сохранены с объекта ID
Альтернативой вы можете рассмотреть независимо от типа базы данных для хранения ваши данные как строка JSON. Таким образом, хранящиеся данные могут быть настолько динамичными, насколько это необходимо, и их можно свободно менять. Недостатки этого включают ограниченные серверные и клиентские обработчики JSON, которые будут выполнять все «тяжелые» запросы, разбор и другие данные, связанные с данными.
Как и другие, NoSQL базы данных звучат так, как будто вы ищете, чтобы избежать структурных требований реляционных баз данных.
Следует различать типы объектов, объекты, атрибуты объектов и экземпляры объектов.
В системе никогда не должно быть более 10 000 объектов. Сохранение такого тела исходного кода было бы ужасным. Вместо этого определите, как иметь от 10 до 100 типов объектов и использовать функции и атрибуты для моделирования тех вещей, которые отличаются.
Даже если вы сначала начинаете с диаграммы или проектирования отношений сущности (проектирование с обратной стороны вперед), вы должны ограничить количество типов данных до 100 и предоставлять нормализованные или денормализованные схемы для представления атрибутов, функций и отношений между вашим разложенных объектов.
Возможно, вы захотите взглянуть на software design patterns, чтобы получить некоторые идеи.
Это распространенное заблуждение относительно реляционных баз данных, что таблицы представляют типы объектов, это на самом деле идея, полученная из сетевой модели данных. В соответствующих реляционных базах данных каждая таблица представляет собой тип факта, который может включать любое количество типов объектов в разных ролях. – reaanb
@reaanb, я согласен с тем, что объект 1-к-1 для сопоставления таблиц обычно не подходит. Модель сетевых данных является лишь одной из причин. Дизайн ленивого объекта и дизайн ER - это еще один. Помимо упомянутого вами типа типа фактов, существуют различные причины для поиска определенных уровней нормализации в схеме (основанные на практических ETL-тестах, проблемах синхронизации, скорости запросов и ресурсах). Дизайн объектов лучше всего управляется интеллектуальным дизайном сервисных или микросервисных интерфейсов. Структуры объектно-реляционного сопоставления намерены объединить два. –
Если кто-то должен был указывать источник и требовать, чтобы это было правдоподобным или официальным, чтобы ответить на этот вопрос, я был бы склонен отклонить источник как НЕ достоверный просто потому, что система с типами объектов 10K + является анти-шаблоном. Лучших практик не существует, кроме как найти способ не поддерживать так много типов объектов. В некоторых ответах есть некоторые рекомендации для этого. – FauChristian