【问题标题】:alternative of join in a single db table在单个数据库表中加入的替代方法
【发布时间】:2013-11-14 23:13:57
【问题描述】:

我遇到了一个正在执行 2 个表连接的情况。记录结构是这样的:

<person>
 <name>person name1</name>
 <dept>dept1</dept>
 <dept>dept2</dept>
 <dept>dept3</dept>
</person>

<person>
 <name>person name2</name>
 <dept>dept4</dept>
 <dept>dept5</dept>
</person>

在这里你可以看到一个人可以属于多个部门,所以一个名为 person 的表和一个名为 dept 的表将解决这个目的。

有没有一种方法可以在一个表中管理相同的数据?

我需要一种方法来拥有一个数据库表,我可以在其中拥有可变数量的列来存储部门值。

RDBMS 有没有办法实现这一点? 我也很感激任何开箱即用的想法。

提前致谢

【问题讨论】:

  • 您打算使用哪种 RDBMS?
  • 我更喜欢任何开源数据库,它没有任何商业关联或倾向,例如PostgreSQL、德比等

标签: database-design


【解决方案1】:

你说:

在这里你可以看到一个人可以属于多个部门,所以一个名为 person 的表和一个名为 dept 的表就可以解决这个问题。

三思而后行。如果人员和部门之间的关系是ownsvisits,则不是一对多关系,而是多对多关系,因为一个人可以拥有或访问多个部门,一个部门可以是不止一个人拥有或访问过。鉴于你的例子,这将转化为这个(见dept3):

<person>
 <name>person name1</name>
 <dept>dept1</dept>
 <dept>dept2</dept>
 <dept>dept3</dept>
</person>

<person>
 <name>person name2</name>
 <dept>dept3</dept>
 <dept>dept4</dept>
 <dept>dept5</dept>
</person>

但这当然取决于你没有提到的要求。

有没有一种方法可以在一个表中管理相同的数据?

我只能想到三种方法(一种比另一种更糟糕):

  • 将列添加到所需的最大值(假设您知道每人不会超过 X 个部门)
  • 只保留两列,一列用于人员,另一列用于部门,并将其用作多值字段(yuk!)。 EG:使用某种分隔符来识别一个部门何时完成并启动另一个
  • 实体-属性-值模型:这已在 StackOverflow 中讨论过很多次。 Here 是关于如何使用它的说明

我需要一种方法来拥有一个数据库表,我可以在其中拥有可变数量的列来存储部门值。

任何 RDBMS 中的变量实际上不是列而是行,因此处理这个总是很复杂。

RDBMS 有没有办法实现这一点?

任何主要的都可以。

我的意见?使用更多表!这种解决方案会给你带来麻烦和麻烦!

【讨论】:

  • +1 非常周到的回答。逻辑数据和物理数据之间往往存在脱节。你在指出差异方面做得很好。干得好。
【解决方案2】:
create table mytable(
    record_id int(11) not null auto_increment,
    ss_num   int(9) not null,
    firstname varchar(20) not null,
    lastname  varchar(20) not null,
    middlename varchar(20),
    deptid     int(11),
    deptname   varchar(5),
    primary key(record_id)
)

您可能不需要提供的所有字段。所以根据需要进行编辑。

【讨论】:

  • 可能有很多部门,所以恐怕你的解决方案行不通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2017-06-07
  • 2018-09-13
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多