我需要一些关于如何构建数据库的输入。
假设我想将成员数据存储在成员表中。有两种类型的成员,比方说人和组织。个人和组织拥有不同的信息集,因此我们必须将它们存储在两个不同的表中:让我们说人和组织。
我会有以下表格:
成员:
id
member_type_id
status
etc..
member_types:
id
type (person|organization|or any other type if needed)
人
id
name
etc
组织:
id
name
etc
我的问题是:哪一个是以下最好的?
还有另一个要求,即可能有另一个表引用人员和组织表。假设我们有一个名为访客的表,他也可以是个人或组织。
感谢您的投入。
答案 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%的东西进行了优化。
沃尔特