我有一个组列。 群组在group_types(买家,卖家,裁判)中存储了不同的类型。只有当集团属于买方类型时,才有其他类型(更专业),如电气和机械。
我对如何将其存储在数据库中感到困惑。
有人可以建议我使用数据库结构吗?
感谢
答案 0 :(得分:3)
将您的group_types
存储为hieararchical表(使用nested sets
或parent-child
型号):
Parent-child
:
typeid parent name 1 0 Buyers 2 0 Sellers 3 0 Referee 4 1 Electrical 5 1 Mechanic
SELECT *
FROM mytable
WHERE group IN
(
SELECT typeid
FROM group_types
START WITH
typeid = 1
CONNECT BY
parent = PRIOR typeid
)
将选择Oracle
中的所有买家。
Nested sets
:
typeid lower upper Name 1 1 2 Buyers 2 3 3 Sellers 3 4 4 Referee 4 1 1 Electrical 5 2 2 Mechanic
SELECT *
FROM group_types
JOIN mytable
ON group BETWEEN lower AND upper
WHERE typeid = 1
将选择任何数据库中的所有买家。
如果您不需要在Nested sets
上进行分层排序或频繁更新, group_types
可在任何地方实施且性能更高。
Parent-child
可以在Oracle
和SQL Server
中轻松实现,并且可以在MySQL
中轻松实施。它允许简单的结构更改和分层排序。
在我的博客中查看有关如何在MySQL
中实现它的文章:
答案 1 :(得分:0)
您可以存储其他类型,例如buyer_mechanical
或buyer_electrical
。
答案 2 :(得分:0)
你可以尝试:
Group
group_id
group_name
group_parent_id
with entries (1, buyers, 0), (2, sellers, 0), (3, referee, 0), (4, electrical, 1), (5, mechanical, 1)
这具有无限可扩展的优势,因此每个子组可以拥有任意数量的子组。
答案 3 :(得分:0)
通常,您有扩展表。这些只是模式中的附加表,其中包含通过某种类型的键
链接到主表的其他信息例如,假设你的主表是:
People
PersonId int, PK
GroupTypeId int, FK to GroupTypes
Name varchar(100)
GroupTypes
GroupTypeId int, PK
GroupTypeName varchar(20)
BuyerTypes
BuyerTypeId int, PK
BuyerTypeName varchar(20)
BuyerData
PersonId int, FK
BuyerTypeId int FK
==== 此外,BuyerData将在PersonId和BuyerTypeId
上具有复合主键(PK)在提取买方数据时,您可以使用
之类的查询SELECT *
FROM People P
INNER JOIN BuyerData BD on (P.PersonId = BD.PersonId)
INNER JOIN BuyerTypes BT on (BD.BuyerTypeId = BT.BuyerTypeId)
答案 4 :(得分:0)
grouptype:ID,姓名('买家','卖家','裁判')
group:GroupTypeID,ID,Name('electrical'和'mechanical',如果grouptypeid =='买家')
联系人:GroupTypeID(NOT NULL),GroupID(NULL),其他属性
表组将根据需要填充GroupTypes的记录。
Contact.GroupID可以为NULL,因为GroupType不需要任何组。
用户界面必须处理群组选择。您可以使用触发器检查组/类型逻辑。