【问题标题】:How to represent "to be approved" elements in database如何在数据库中表示“待批准”元素
【发布时间】:2017-01-15 08:18:55
【问题描述】:

我有一个模型,它有一个名为 type 的属性,它是 userbag 的一种类型(用实体代替机密性) )。

  • Users 可以有多个 Bags(一对多)
  • Bags 只有一个 Type
  • Type 具有字段 namedescription
  • BagType 可以是:
    • 从一组预先确定的值中选择;要么
      • 我会将这些预加载到数据库中
    • 由用户指定
      • 如果User 申请获得批准,则其自定义Type 将添加到预定集合中。

基本上,新的Type 的存在取决于User 的批准状态。


我想问什么是表示这三个对象关系的理想方式。

这是我的策略:

  • Bag 具有 idUser
  • Bag 具有 Typeid
  • 用预先确定的值填充Type 表,然后返回查看User 以供选择

如果Types 已预先确定,则上述规则集已准备就绪。

挑战在于何时有需要批准值。

要处理新的Types,

  • 所有自定义Types 仍将添加Type表中
  • Type 表将有 approveddate_approved 字段
    • 如果预先确定,那么它们的值将分别为1 和当前数据库上传/默认时间。
    • 如果是新的,那么它们的值一开始将为空,但一旦指定它们的User 被批准,它们就会更新。
      • 我将从BagjoinUserselect 获取这些值

这是我的示例表:

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
}

我提出的解决方案可以吗,或者您能建议一种更好的方法来处理这种业务逻辑吗?

【问题讨论】:

    标签: php database database-design normalization database-normalization


    【解决方案1】:

    在你的定义中,一个包只能有一个用户和一种类型,所以它只不过是用户和类型之间 n:m 关系的链接表。看起来这是你的意图。 不需要 USER 的字段,因为它们只是 TYPE 的属性

    approved TINYINT,
    date_approved DATETIME
    

    【讨论】:

      【解决方案2】:

      这是一个常见问题,它有一个同样常见的数学解决方案,几乎在每种语言中都实现了。总之,就是将两个不同的组组合成“集合”,然后对这两个集合应用对称差分、差分、交集或联合操作。我相信你能找到你想要的,但这里有所有的,可以满足所有相关的需求:

      对称差分修改第一个集合,使其等于 ((A - B) U (B - A)),其中 A 是第一个集合,B 是另一个集合。另一个集合是应该具有从 [参见 symmetricDifferenceSet 代码,下面计算的对称差值的集合;如果您不想修改原始集,而是创建一个新集,请参阅我在 createSymmetricDifferenceSet 中提供的代码,也在下面]。

      difference(或 minus)、intersectunion 操作您应该已经很熟悉了。

      以下是这些操作在 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 语句必须具有相同的 列数。这些列还必须具有相似的数据类型。 此外,每个 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 结果集中的列名通常等于 UNION 中第一个 SELECT 语句中的列名。

      YouTube 用户发布了大量有关这些特定操作的视频;示例见SQL Intersect, Union, Union All, Minus, and Except

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 2013-06-29
        • 2017-10-14
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        相关资源
        最近更新 更多