0

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

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

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

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

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

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

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

Задача заключается в том, когда есть , подлежащие утверждению. значения.

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

  • все пользовательские 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 
} 

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

ответ

1

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

approved TINYINT, 
date_approved DATETIME 
1

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

Симметричной разница изменяет первый сет таким образом, что она равна ((A - B) U (B - A)), где A - первое множество, а B - другое множество. Другой набор - это набор, который должен иметь симметричную разность, вычисленную из [см. Код симметричногоDifferenceSet, ниже; если вы не хотите изменять исходный набор, но вместо этого создайте новый набор, см. мой код, указанный в 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 в 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.

Пользователи YouTube опубликовали множество видеороликов по этим конкретным операциям; см. пример SQL Intersect, Union, Union All, Minus, and Except.

 Смежные вопросы

  • Нет связанных вопросов^_^