【问题标题】:which database type are good for arrays?哪种数据库类型适合数组?
【发布时间】:2010-07-18 15:17:35
【问题描述】:

我希望我的数据库支持一家拥有许多用户的公司,我该怎么做?
示例

用户表(UID、用户名、密码)
公司表(CID、公司名、用户是公司的所有者) )

我该怎么做?我应该怎么办 ?我应该在 php 中创建一个数组,如 1241,423,4123 *uid's 将插入到公司行所有者的用户上吗?还是有更好的主意?

【问题讨论】:

  • 将数组存储在数据库的一个字段中是一种糟糕的做法。这使得查询数据变得更加困难。

标签: php database database-design database-connection


【解决方案1】:

如果您希望每个用户拥有一个(并且永远不会更多)公司,您应该拥有:

  • user
    • uid
    • username
    • ...
    • company_id
  • company
    • company_id
    • company_name
    • ...

那么,user.company_id 将是一个 foreign key,它引用了 company.company_id

然后,你存储:

  • user 中每个用户的一行
    • 为该用户引用正确公司的 ID
    • 这是company 表中右行的company_id
  • company 中的每个公司都有一条线路

公司表中没有存储用户的相关信息——当每个用户“指向”一个公司时,一个公司可以有多个用户。


像您建议的那样将数据存储为数组绝对不是一个好主意——只是不是关系数据库的工作方式。


如果每个用户可以有多个公司,每个公司可以有多个用户,则您必须添加第三个表 (a join table),这将表明,对于每个用户,他们隶属于哪个公司:

  • user
    • uid
    • username
    • ...
  • company
    • company_id
    • company_name
    • ...
  • user_company
    • uid
    • company_id

在这种情况下,company 表中没有与用户相关的内容,user 表中也没有与公司相关的内容:它们之间的链接在user_company 表中。

当然,user_company.uid 将是 user.uid 的外键;而user_company.company_id 将是company.company_id 的外键。

【讨论】:

  • 帕斯卡你什么时候睡觉?呵呵,很好的答案。多对多怎么样?
  • @Adam : 好吧,现在是下午 5:30,所以不是睡觉的时间 ;-) ;;;对于多对多部分,您必须使用连接表,如我的回答 的第二部分中所述(我已对其进行了编辑,因此您在发表评论之前可能没有看到该部分)
  • “级联”的事情可以由您的数据库服务器完成(但取决于服务器);但我更喜欢自己在我的应用程序代码中这样做,而不是使用数据库引擎的该功能;这样,我就知道更新/删除了什么;;;而cascade和many-to-many关系不大:many-to-many表示每个用户可以有几个公司,每个公司可以有多个用户。
  • 顺便说一句,在 user_company 中哪一个是 PK ?公司编号?用户界面?还是没有PK? PK已经是独一无二的了吗?还是我们最好把 UQ 放到 PK 中?
  • PK是一行的标识符;所以,它必须是独一无二的(它是);;在 user_company 中,标识符是一对用户/公司;因此,primary_key 将在这两个字段上(您可以在索引中有多个字段;PK 是一种特定类型的索引)
【解决方案2】:

有一个更好的主意 - 它称为跨表连接。您所做的是创建第三个表,其中包含两列。在这两列中,您存储要相互连接的表的主键。

这个想法是您正在创建公司和用户之间的关系。在关系型数据库中,表之间的关系是通过外键来表示的。

当然,这只适用于您希望将多个用户连接到多个公司(“M-N”关系)的情况。如果您想将多个用户连接到一个公司,只需将公司 ID 列添加到用户即可。

【讨论】:

    【解决方案3】:

    任何关系数据库都是不错的选择。看看MS SQLMySQL

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2012-03-02
      • 2013-03-22
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多