модель данных, many2many со связью many2one - PullRequest
0 голосов
/ 21 октября 2010

У меня есть два типа учетных записей (клиент и поставщик), я выбрал стратегию единой таблицы для постоянства. Клиент создает Заказы (one2many) и предложения поставщиков на заказы в стиле аукциона (отношение многие2many, потому что он может делать ставки на многие заказы, а также на других поставщиков). У меня вопрос, возможно ли иметь эти отношения одновременно? Потому что по логике это может работать. Но генераторы кода MDA не любят это. Если да, то с какими недостатками я могу столкнуться с этой моделью данных.

Заранее спасибо.

alt text

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Недостатком является то, что вы не можете обеспечить ссылочную целостность в базе данных между accountID в таблице аккаунтов и accountID в таблице ставок (который, как я полагаю, представляет собой accountID ставки провайдера на порядок), поскольку не все значения accountID являются допустимыми.

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

  1. Удалить isProvider и isCustomer со счетов.

  2. Добавьте две новые таблицы Поставщики и Клиенты. Каждая таблица будет иметь столбец accountID, который является первичным ключом в этой таблице и внешним ключом к исходной таблице счетов.

  3. Перенос любых дополнительных столбцов из учетных записей, которые являются уникальными для поставщиков или клиентов, в соответствующую таблицу.

  4. Теперь идентификатор учетной записи в таблице «Заказы» должен быть внешним ключом для клиентов, а не для учетных записей. Аналогично, столбец accountID в Bids становится внешним ключом для провайдеров, а не для аккаунтов.

Обеспечивается реляционная целостность и хранение в одной таблице для учетных записей.

1 голос
/ 21 октября 2010

«Я выбрал одностоловую стратегию для настойчивости» - это, на мой взгляд, не очень хорошая причина для их объединения. Клиенты и провайдеры - это принципиально разные звери.

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

Я бы разделил их на разные таблицы для решения этой конкретной проблемы.

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

Возможно, вы захотите, если одна и та же сущность может быть как клиентом, так и поставщиком - в этом случае вы захотите, чтобы две разные записи таблицы совместно использовали одну и ту же информацию (такую ​​как баланс, репутация и т. Д.).

...