У меня есть модель, где он имеет атрибут с именем тип это тип пользователь«s мешок (замените юридические лица на конфиденциальность).
Users
может иметь несколько Bag
с (один ко многим)Bags
есть только один Type
Type
имеет поля name
а также description
Bag
«s Type
может быть:
User
заявка утверждается, то их заказ Type
добавляется в предопределенный набор.В основном новый Type
существование зависит от User
Статус одобрения.
Я хочу спросить, что является идеальным способом представить отношения этих трех объектов.
Вот моя стратегия:
Bag
имеет id
из User
Bag
имеет id
из Type
Type
таблица с предопределенными значениями, и вернуться к просмотру для User
выбрать извышеприведенный набор правил готов к работе, если Type
с заранее определены.
Проблема в том, когда есть быть одобренным ценности.
Чтобы справиться с новым Type
s,
Type
s все еще будет добавлен к 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
}
Хорошо ли предложенное мной решение или вы можете предложить лучший способ справиться с такой бизнес-логикой?
По вашему определению, сумка может иметь только одного пользователя и один тип, так что это всего лишь таблица ссылок для отношения n: m между пользователем и типом. Похоже, это твое намерение.
Нет необходимости в полях пользователя, потому что они являются только атрибутами типа
approved TINYINT,
date_approved DATETIME
Это общая проблема, которая имеет одинаково общее математическое решение, которое реализовано почти на каждом языке. В общем, то есть объединить две несопоставимые группы в «наборы», а затем применить симметричную разность, разность, пересечение или операцию объединения двух наборов. Я уверен, что вы можете выяснить, что вы хотите, но вот все из них для удовлетворения всех потребностей, связанных с:
Симметричная разность изменяет первый набор так, что он равен ((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, объединение, объединение всех, минус и исключение для примера.