Дизайн схемы базы данных

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

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

TBL_PRODUCTS:
ID
Описание Подробности

TBL_CUSTOMER:
ID
Имя
Адрес

TBL_ORDER:
ID
TBL_CUSTOMER.ID
prod1
prod2
prod3
и т. д.

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

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

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

Вдобавок ко всему, каждый заказ должен иметь собственный контрольный журнал, так как с ним может случиться много вещей в течение его срока службы. Журнал аудита может содержать обычную информацию - пользователя, время / дату, действие и может иметь любую длину. Могу ли я сохранить контрольный журнал для определенного заказа в его собственной таблице (поскольку они могут стать довольно длинными), созданными при создании заказа?

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

Есть ли какая-то особая причина использовать этот «TBL_» в качестве префикса? Лично мне эти приставки не нравятся. Это усложняет задачу для клиентов SQL, функция автозавершения кода IDE.

Adeel Ansari 24.12.2008 07:36

да, я бы не стал использовать TBL_, это было именно то, что я выбил, набирая вопрос, чтобы люди знали, что я имел в виду, что это имя таблицы.

Michael Galos 24.12.2008 08:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
3
2
9 791
6

Ответы 6

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

TBL_ORDER:
ID
TBL_CUSTOMER.ID

TBL_ORDER_ITEM:
ID
TBL_ORDER.ID
TBL_PRODUCTS.ID
Quantity
UniqueDetails

То же самое может относиться к контрольному следу вашего заказа. Это может быть новая таблица, например

TBL_ORDER_AUDIT:
ID
TBL_ORDER.ID
AuditDetails

Не забудьте указать "цену продажи" в TBL_ORDER_ITEM, поскольку она может отличаться от "цены за единицу" в TBL_PRODUCT.

jmucchiello 24.12.2008 07:51

Прежде всего, третья нормальная форма Google. В большинстве случаев ваши таблицы должны быть 3NF, но есть случаи, когда это не так из-за производительности или простоты использования, и только опыт может действительно научить вас этому.

То, что у вас не нормализовано. Для реализации связи "многие ко многим" необходима «таблица соединений».

TBL_ORDER:
ID
TBL_CUSTOMER.ID

TBL_ORDER_PRODUCT_JOIN:
ID
TBL_ORDER.ID
TBL_Product.ID
Количество

TBL_ORDER_AUDIT:
ID
TBL_ORDER.ID
Audit_Details

Взгляните на Agile Web Development with Rails, в нем есть отличный раздел об ActiveRecord (реализация одноименного шаблона проектирования в Rails) и он действительно хорошо объясняет эти типы отношений, даже если вы никогда не используете Rails. Вот также хорошее онлайн-руководство.

Я не понимаю, почему это отвергается, когда я пытаюсь ответить на вопрос Mrgreen о ресурсах для обучения методам проектирования баз данных? Ребята, вы читали эти главы и не согласны с методами проектирования или есть другая причина?

Abdullah Jibaly 24.12.2008 08:34

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

William Brendel 24.12.2008 08:44

Проголосовали против: объяснение схемы БД с помощью ActiveRecord похоже на объяснение фундаментальных законов электричества путем обучения подключению кабеля питания к розетке.

Andrew not the Saint 04.01.2009 08:09

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

Abdullah Jibaly 04.01.2009 09:22

Основное условное имя столбца идентификатора в таблице Заказы (множественное число, потому что ORDER является ключевым словом в SQL) - «Номер заказа» с различным точным написанием (OrderNum, OrderNumber, Order_Num, OrderNo, ...).

Префикс TBL_ лишний; это вдвойне излишне, поскольку это не всегда означает таблицу, как, например, в имени столбца TBL_CUSTOMER.ID, используемом в таблице TBL_ORDER. Кроме того, вообще плохая идея - пробовать использовать "." в середине названия столбца; вам придется всегда рассматривать это имя как идентификатор с разделителями, заключая его либо в двойные кавычки (стандартный SQL и большинство СУБД), либо в квадратные скобки (MS SQL Server; не уверен в Sybase).

Джо Селко много говорит о таких вещах, как именование столбцов. Я не согласен со всем, что он говорит, но это легко найти. См. Также Фабиан Паскаль «Практические вопросы управления базами данных».

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

Изучите моделирование отношений сущностей (ER) для анализа требований к базе данных.

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

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

Вам не нужно делать все вышеперечисленное, прежде чем вы когда-либо спроектируете и создадите свою первую базу данных. Но то, чего вы не знаете, БУДЕТ вам больно Как и в случае с любым другим навыком, чем больше вы им занимаетесь, тем лучше вы становитесь. А изучение того, что уже знают другие, намного дешевле, чем изучение методом проб и ошибок.

Хотя я и не являюсь справочником по проектированию схем базы данных, я часто использую библиотеку схем по адресу DatabaseAnswers.org. Это хорошее место для прыжков, если вы хотите иметь что-то, что уже было обработано. Они не идеальны и, скорее всего, их нужно будет модифицировать в соответствии с вашими потребностями, но их там более 500.

Другие вопросы по теме