实现关联表

时间:2011-07-14 21:31:42

标签: mysql

我想知道是否有人可以帮助我以你认为正确的方式组织我的MySQL表(我在某处读到关联表是我正在寻找的)。我在实施它们时遇到了麻烦。

以下是一个例子:

Location            Type                 Event                   Date
Location 1          bar, disco           event1                  friday
Location 1          bar, disco           event2                  saturday
Location 2          bar, restaurant      Event3                  friday

如果您想在数据库中只有一次“位置1”,并将与之关联的事件存储在其他地方,您会怎么做?这同样适用于类型部分。我无法决定如何将多个变量设置到一个位置,例如酒吧也是餐馆等......

2 个答案:

答案 0 :(得分:2)

LocationsEvents之间的关系是1对多关系的示例。这意味着每个单独的位置可以有许多与之关联的事件。这些类型的关系通常通过向引用“一个”表(位置)的主键的“多个”表(事件)添加外键来实现。

“地点”和“类型”之间的关系是多对多关系的一个例子。这意味着一个位置可以有许多类型,一个类型可以与许多位置相关。这些类型的关系通常使用链接表实现,该链接表包含相关行的外键。链接表通常具有两个外键的复合主键,这意味着一个位置无法两次链接到“bar”类型。

因此,以下表格结构可能适合您:

Location: ID (primary key), LocationName, ...
Events: ID (primary key), LocationID (foreign key), Date, Name, ...
LocationTypes: LocationID (fk), TypeID (fk)
Types: ID (pk), Name, ...

要查询多个表中的信息,必须使用连接。对于1对多关系,以下查询将起作用:

SELECT
    l.LocationName, e.Name, e.Date
FROM Location l
    JOIN Events e ON l.ID = e.LocationID

对于多对多关系,以下查询会将信息连接在一起。

SELECT
    l.LocationName, t.Name as TypeName
FROM Location l
    JOIN LocationTypes lt ON l.ID = lt.LocationID
    JOIN Types t ON lt.TypeID = t.ID

这些示例仅显示标准的内部联接,还有其他联接类型可能更适合您的需求。

答案 1 :(得分:1)

假设该类型是位置的类型

tblType
id int
name varchar

tblLocation
id int
name varchar

tblLocationType (m-n relation)
fk_type int (ref. tblType.id)
fk_location int (ref. tblLocation.id)

tblEvent
id int
name varchar
place int (ref. tblLocation.id)
date DATETIME

编辑:你的例子如下:

tblType
id name
1  bar
2  disco
4  restaurant

tblLocation
id name
1  Location 1
2  Location 2

tblLocationType
1 1
2 1
1 2
3 2

tblEvent
1 event1 1 whenever
2 event2 1 whenever
3 event3 2 whenever