Как представить «быть утвержденным» элементы в базе данных

У меня есть модель, где он имеет атрибут с именем тип это тип пользователь«s мешок (замените юридические лица на конфиденциальность).

  • Users может иметь несколько Bagс (один ко многим)
  • Bags есть только один Type
  • Type имеет поля name а также description
  • Bag«s Type может быть:
    • выбирается из заранее определенного набора значений; или же
      • Я предварительно загружу их в базу данных
    • указанный пользователем
      • если User заявка утверждается, то их заказ Type добавляется в предопределенный набор.

В основном новый Typeсуществование зависит от UserСтатус одобрения.


Я хочу спросить, что является идеальным способом представить отношения этих трех объектов.

Вот моя стратегия:

  • Bag имеет id из User
  • Bag имеет id из Type
  • населять Type таблица с предопределенными значениями, и вернуться к просмотру для User выбрать из

вышеприведенный набор правил готов к работе, если Typeс заранее определены.

Проблема в том, когда есть быть одобренным ценности.

Чтобы справиться с новым Types,

  • все на заказ Types все еще будет добавлен к Type Таблица
  • Type стол будет иметь approved а также date_approved поле
    • если предопределено, то их значения будут 1 и текущее время загрузки базы данных / по умолчанию соответственно.
    • если новый, то их значения сначала будут нулевыми, но будут обновлены один раз User кто их указал, одобрен.
      • я буду select их из Bag а также join с User чтобы получить эти значения

Вот мои примеры таблиц:

TABLE user {
id PK,
approved TINYINT,
date_approved DATETIME
}

TABLE bag {
id PK,
id_user FK REFERENCES user(id) NOT NULL,
id_type FK REFERENCES type(id) NOT NULL
}

TABLE type {
id PK,
name NOT NULL,
description NOT NULL,
approved TINYINT NOT NULL,
date_approved DATETIME NOT NULL
}

Хорошо ли предложенное мной решение или вы можете предложить лучший способ справиться с такой бизнес-логикой?

0

Решение

По вашему определению, сумка может иметь только одного пользователя и один тип, так что это всего лишь таблица ссылок для отношения n: m между пользователем и типом. Похоже, это твое намерение.
Нет необходимости в полях пользователя, потому что они являются только атрибутами типа

approved TINYINT,
date_approved DATETIME
1

Другие решения

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

Симметричная разность изменяет первый набор так, что он равен ((A — B) U (B — A)), где A — первый набор, а B — другой набор. Другой набор — это набор, который должен иметь симметричную разность, рассчитанную по формуле [см. Симметрический код ниже; если вы не хотите изменять исходный набор, но вместо этого создаете новый набор, см. мой код, предоставленный в createSymmetricDifferenceSet, также ниже].

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

Вот как эти операции выполняются в Objective-C (ваша реализация может немного отличается):

- (void) symmetricDifferenceSet:(NSMutableSet *)otherSet {

NSMutableSet * copySet = [self copy];

[copySet minusSet:otherSet];
[otherSet minusSet:self];
[self unionSet:copySet];
}

- (NSMutableSet *) createSymmetricDifferenceSet:(NSMutableSet *)otherSet {

NSMutableSet * copySet = [self copy];

[copySet minusSet:otherSet];
[otherSet minusSet:self];
[copySet unionSet:otherSet];

return copySet;
}

- (NSMutableSet *) createMinusSet:(NSMutableSet *)otherSet {

NSMutableSet * copySet = [self copy];

[copySet minusSet:otherSet];

return  copySet;
}

- (NSMutableSet *) createIntersectionSet:(NSMutableSet *)otherSet {

NSMutableSet * copySet = [self copy];

[copySet intersectSet:otherSet];

return  copySet;
}

- (NSMutableSet *) createUnionSet:(NSMutableSet *)otherSet {

NSMutableSet * copySet = [self copy];

[copySet unionSet:otherSet];

return  copySet;
}

Я не знаю SQL, как раньше; но, эквивалент вышеупомянутого может быть установлен от W3Schools.com. Например, на http://www.w3schools.com/sql/sql_union.asp:

Оператор SQL UNION Оператор SQL UNION объединяет результат двух
или больше операторов SELECT.

Обратите внимание, что каждый оператор SELECT в UNION должен иметь одинаковый
Число столбцов. Столбцы также должны иметь похожие типы данных.
Кроме того, столбцы в каждом операторе SELECT должны быть в том же порядке.

Синтаксис SQL UNION

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

Примечание. Оператор UNION выбирает только отдельные значения по умолчанию. к
разрешить повторяющиеся значения, используйте ключевое слово ALL с UNION.

SQL UNION ALL Синтаксис

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

PS: Имена столбцов в наборе результатов UNION обычно равны
имена столбцов в первом операторе SELECT в UNION.

Пользователи YouTube опубликовали множество видео по этим конкретным операциям; увидеть Пересечение SQL, объединение, объединение всех, минус и исключение для примера.

1