Database design 在单个db表中联接的替代方法

Database design 在单个db表中联接的替代方法,database-design,Database Design,我有一种情况,两个表的连接正在执行。记录结构如下所示: <person> <name>person name1</name> <dept>dept1</dept> <dept>dept2</dept> <dept>dept3</dept> </person> <person> <name>person name2</name>

我有一种情况,两个表的连接正在执行。记录结构如下所示:

<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>

人名1
部门1
dept2
dept3
人名2
部门4
部门5
在这里,您可以看到一个人可以属于多个部门,因此名为person的表和名为dept的表可以解决这个问题

是否有一种方法可以在单个表中管理相同的数据

我需要一种方法来创建一个数据库表,在这个表中,我可以有可变数量的列来存储dept值

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

提前谢谢

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)
)
您可能不需要显示所有字段。因此,请根据需要进行编辑。

您说过:

在这里,您可以看到一个人可以属于多个部门,因此名为person的表和名为dept的表可以解决这个问题

对此评论三思而后行。如果个人和部门之间的关系是
拥有
访问
,则不是一对多关系,而是多对多关系,因为一个人可以拥有或访问多个部门,而一个部门可以拥有或访问多个人。根据您的示例,这将转化为以下内容(请参见
dept3
):


人名1
部门1
dept2
dept3
人名2
dept3
部门4
部门5
当然,这取决于您没有提到的需求

是否有一种方法可以在单个表中管理相同的数据

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

  • 将列添加到所需的最大值(假设您知道每人不会超过X个部门)
  • 只留下两列,一列用于个人,另一列用于部门,并将其用作多值字段(yuk!)。例如:使用某种分隔符来标识一个部门何时结束,何时开始另一个部门
  • 实体属性值模型:这在StackOverflow中已经讨论过多次。这是一个如何使用它的范例
我需要一种方法来创建一个数据库表,在这个表中,我可以有可变数量的列来存储dept值

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

RDBMS有没有办法实现这一点

任何主要的都可以


我的意见?多用几张桌子!此解决方案将为您带来复杂性和许多麻烦

你在考虑使用哪种RDBMS?我更喜欢没有任何商业关联或倾向的开源数据库,例如PostgreSQL、Derby等。这里可能有很多deptid,所以恐怕你的解决方案不起作用。+1非常周到的回答。逻辑数据和物理数据之间往往存在脱节。你在指出差异方面做得很好。干得好
<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>