需要一些关于MySQL模式的输入

时间:2010-01-15 13:09:46

标签: mysql normalization

我需要一些关于如何构建数据库的输入。

假设我想将成员数据存储在成员表中。有两种类型的成员,比方说人和组织。个人和组织拥有不同的信息集,因此我们必须将它们存储在两个不同的表中:让我们说人和组织。

我会有以下表格:

成员:

id
member_type_id
status
etc..

member_types:

id
type (person|organization|or any other type if needed)

id
name
etc

组织:

id
name
etc

我的问题是:哪一个是以下最好的?

  1. 在人员和组织表格中都有member_id
  2. 在members表中有一个额外的列来存储person_id或organization_id
  3. 在members表中有两个额外的列来存储person_id或organization_id,无论哪个适用
  4. 还有另一个要求,即可能有另一个表引用人员和组织表。假设我们有一个名为访客的表,他也可以是个人或组织。

    感谢您的投入。

2 个答案:

答案 0 :(得分:1)

通常最好绘制出您的关系,以便更容易理解这两个实体之间的关系。这将让您轻松地说这是一对一,多对一,一对多或多对多等。

有人说,一旦你弄清楚这一点,设置就很简单了。

如果您使用的是Java或.Net,则可以使用Hibernate / NHibernate通过指定关系自动为您构建表。

以下是我如何根据您的概述设计表格: (请记住,这是遵循Java命名模式)

MemberType
id     (int11, auto increment, primary key)
name   (varchar31, unique)

One note about MemberType, if you're using Java and you will not dynamically add/remove member types, you should use an enum here.


Member
id    (int11, auto increment, primary key)
memberType_id (int11, on update cascade, on delete cascade)


Organization
id    (int11, auto increment, primary key)
name  (varchar31, unique)

-- Depends on how you want this structured (I would design it as a many-to-many relationship
MemberOrganization
member_id       (int11, on update cascade, on delete cascade, this links to the member id)
organization_id (int11, on update cascade, on delete cascade, this links to the organization id)

获取特定组织的所有成员的列表......

SELECT
 *
FROM
 Organization o
 INNER JOIN MemberOrganization mo ON mo.organization_id = o.id
 INNER JOIN Member m ON m.id = mo.member_id
WHERE
 o.name = 'StackOverFlow.com'

再次查看您的问题后,我认为您正在寻找不同的答案。

沃尔特

答案 1 :(得分:0)

你也可以这样做:

会员 ID 名称 状态

人(扩展成员) id(链接到成员ID)

组织(扩展成员) ID

访问者 ID 日期 member_id(再次,这链接到成员表,您将不得不进行外部联接以获取实际的成员数据,无论是个人还是组织)

这使用主键连接列,并通过每个子类的单独表继承。在Hibernate中,查询会自动为您编写/处理,但它们并不难编写。

如果有帮助,请告诉我。

此外,您使用的是PHP,Java等吗?您能否提供更多背景信息,以了解您需要或正在使用的内容?可能有一个更好的桌面设计与此截然不同。

就像我说的那样,有些工具可以为你自动化这些东西,所以你不必担心低级别的细节。当然,您甚至在使用工具之前就需要了解这种关系,否则,您将不会有任何好转。理解它们很好,但是这些工具针对你需要的90%的东西进行了优化。

沃尔特