избегать дублирования таблицы - PullRequest
0 голосов
/ 12 марта 2011

У меня есть таблица с данными о задачах, таких как Id, Name, Date, WorkerId, VehicleId (и более 50 полей).

Я хотел бы создать модуль заказов, который позволит пользователям вставлять задачи как заказ. Заказ содержит подмножества полей из задачи, например, только WorkerId и VehicleId (как я уже сказал - в таблице задач есть более 50 полей). Поскольку каждый пользователь может выбрать определение своих полей, составляющих заказ, я должен дублировать таблицу задач и назвать ее таблицей заказов. Поскольку огромный размер (с точки зрения полей) таблицы задач, я хочу избежать дублирования. Есть ли какой-нибудь возможный способ хранения данных заказа, который не включает создание огромной таблицы, например таблицы задач?

P.S. Я не хочу хранить заказы в таблице задач, потому что: 1. будет много заказов, которые могут повлиять на производительность. 2. Есть много много задач.

Ответы [ 4 ]

1 голос
/ 13 марта 2011

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

Прежде чем добавлять Order и связывать их с Задачами или компонентами Задачи, тем самым составляя дублирование,сначала нужно нормализовать задачу.Это приведет к нескольким нормализованным таблицам (Person, Vehicle, Worker), к которым относится Задача, и тогда будет просто добавить Order и связать Order с этими таблицами.

1 голос
/ 12 марта 2011

Если я правильно понимаю, вы хотите создать новую таблицу, но не хотите, чтобы в ней было более 50 столбцов.Это правильно?

Вы можете сделать что-то вроде Orders(ID, Configuration), где Конфигурация - это некое строковое представление всех необязательных данных.Или вы могли бы сделать что-то вроде Orders(ID, FieldID, FieldValue).В этом случае, если у заказа было три из необязательных полей, он будет отображаться как 3 разных строки в таблице.Оба подхода создают проблемы, когда вы хотите запросить их.Я думаю, что я бы укусил пулю и просто имел бы таблицу из 50 столбцов.

1 голос
/ 12 марта 2011

Вы можете добавить поле is_order в таблицу задач и установить для него значение true, если это порядок, или значение false, если это задача.

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

0 голосов
/ 12 марта 2011

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

ord_num  line_item    task_attribute    attribute_value
--
15       1            WorkerId          35
15       2            VehicleId         101-345-2A3574

Сказав это, хотяЯ должен сказать, что

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

Специально для того, чтобы просто заказать один или два номера идентификатора из таблицы задач - WTF это означает означает , в любом случае?

...