Разработчики и разработчики баз данных, привет!Проблемы с проектированием схемы базы данных
Я проектирую схему базы данных для моего проекта.
Проект включает отношения между «Продюсеры» и «Потребители». Но если «Продюсер» может быть как «Пользователь», так и «Организация», тогда «Потребитель» может быть только «Пользователем» (хотя он только сейчас). Если рассмотреть объектную модель моего проекта, она в основном состоит из двух основных интерфейсов - «Производители» и «Потребители». Отношения будут находиться между экземплярами основных классов, которые являются «Организация» и «Пользователь», а более класс «Организация» реализует интерфейс «Продюсер», а «Пользовательский» реализует интерфейсы «Продюсер» и «Конвейер». Например, на определенный период использования моего приложения некоторые пользователи должны иметь возможность продавать товары другим пользователям и иметь возможность покупать товары у кого-либо.
В будущем я планирую интегрировать наиболее востребованные платежные системы к проекту. Скажите, пожалуйста, если у вас есть опыт работы с платежными системами, как это изменит модель и схему базы данных. Нужно ли добавлять объекты «Юридическое лицо» и «Индивидуальный»?
Я разработал ER-диаграмму в соответствии с описанием выше, но имеет несколько недостатков.
Во-первых, нет полное соответствие между ER-описания и описания UML. Нужно ли выделять отдельные таблицы для интерфейсов? Я не знаю. Действительно, в этом случае, согласно описанию ER, можно сказать, что «Продюсер» и «Потребитель» являются суперклассами «Организация» и «Пользователь». Но на самом деле это только интерфейсы.
Во-вторых, мне нужно самое простое проектирование, чтобы обеспечить доступ к хранилищу достаточно гибким, без лишних «JOIN». Может быть, я должен полностью отказаться от реализации интерфейсов? Но я все использую богатство ООП. Можно ли использовать реализации интерфейсов на уровне базы данных? Я знаю, что наследование может быть использовано. Но я не знаю, как эти трюки будут влиять на производительность - из-за всех предыдущих проектов не требовалось использование суперклассов и интерфейсов. Я буду использовать PostgreSQL в качестве реляционной СУБД.
Просьба поделиться своим опытом и реализацией успешных схем баз данных.
UPDATE
Если я буду назначать роли для таблиц «Producer» и «Потребителем», то я должен буду дать им атрибуты, характеризующие сущностей пользователя "и«Организация». С одной стороны, если количество ролей увеличивается, количество атрибутов увеличивается. Этот путь связан с перегрузкой атрибутов таблиц. И некоторые атрибуты для разных ролей будут соответствовать значениям NULL. С другой стороны, один атрибут для одной роли может соответствовать нескольким атрибутам для другой роли. Например, атрибут «имя» для организации «Организация» соответствует атрибутам «firstname», «middlename», «lastname» и «username» для лица «Пользователь». В-третьих, я все еще хочу отделить модели «Продюсер», «Организация», «Пользователь» и «Потребитель» друг от друга.
Я думаю, что вы боретесь с темой «ролей». Это очень распространенная проблема. Человек может играть много ролей. Это не делает человека своего рода ролью, потому что это означает, что это всегда должно быть так. Вы можете обнаружить, что создание ролевых отношений может решить проблему, но я не успел тщательно проанализировать вашу проблему. Вы также можете обнаружить, что субъекты qua (например, человек как производитель) полезны для сохранения истории и других фактов. –
Tricky, действительно. То, что Джим говорит, прав. Я могу посмотреть на это позже вечером (если Джим не даст хороший ответ). –
Я думаю, что вы задаете слишком много вопросов сразу. Я считаю четыре явных вопроса и еще несколько неявных вопросов. Все происходит из-за неточной модели того, что существует в проблемной области. Я предлагаю вам исправить эту проблему. После этого UML и ER могут легко совпадать с этим. Фактически, одна модель UML может служить основой для вашего ООП и вашей БД. –