代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

多种实体的数据库设计

  •  2
  • Alix Axel  · 技术社区  · 15 年前

    我需要开发一个应用程序,其中有4种类型的用户实体(管理员、合作伙伴、公司和客户),每种用户类型都有自己的详细信息集,它们都应该能够执行常见的操作,如发送消息、付款等。这些操作应该保存在一个表上,但是它们需要引用准确的用户,尽管它是类型。

    什么数据库设计更合适?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Erwin Smout    15 年前

    “我只想再添加一件事,您建议我为每种用户类型都创建一个表…我更喜欢这种方法,但是我如何设计一个模式,在这个模式中,我可以说用户ID 7(admin)向用户ID 537(client)发送了一条消息?或者用户ID 70(公司)收到付款?

    没有什么可以阻止你这样做。有一个表发送者-接收者消息(-id)和主键,所有三个属性和两个FK发送者和接收者。fk是指表的主键,它保存所有用户的公共属性。

    现在,您的下一个问题可能是,“但我想有一条规则,X类型的用户不能直接向Y类型的任何用户发送消息”。

    这就是任何电流 实施 关系型数据库管理系统的缺点。即使是Oracle或DB2也不能做到这一点 宣言地 . 关于这个问题,我实在是说得太多了,不适合这个回答。

    顺便说一句,你似乎对我的反应很感兴趣,尽管我投了很多反对票。真的很感激。

        2
  •  5
  •   NA.    15 年前

    我想这是一个完美的例子 inheritance . 将公共属性放在一个表中,然后继承该表为不同的用户类型添加自定义属性。

    混乱的答案对我来说似乎有点混乱,如果你事先不知道你需要存储什么样的财产,这将是有用的。

        3
  •  2
  •   cherouvim    15 年前

    请看一下在企业应用程序体系结构模式中实现这一点的三种方法:

    http://martinfowler.com/eaaCatalog/singleTableInheritance.html

    http://martinfowler.com/eaaCatalog/classTableInheritance.html

    http://martinfowler.com/eaaCatalog/concreteTableInheritance.html

    选择取决于4种类型的用户实体将共享多少属性,还取决于系统需要的用例。

        4
  •  -2
  •   chaos    15 年前
    user
    ================
    id
    user_type_id
    name
    etc
    
    user_type
    ================
    id
    name (admin, partner...)
    etc
    
    user_detail
    ================
    id
    user_id
    user_detail_type_id
    value
    
    user_detail_type
    ================
    id
    name
    
    user_type_to_user_detail_type
    ================
    id
    user_type_id
    user_detail_type_id
    (maps which user types have which detail types)