我想知道是否有人可以帮助我以你认为正确的方式组织我的MySQL表(我在某处读到关联表是我正在寻找的)。我在实施它们时遇到了麻烦。
以下是一个例子:
Location Type Event Date
Location 1 bar, disco event1 friday
Location 1 bar, disco event2 saturday
Location 2 bar, restaurant Event3 friday
如果您想在数据库中只有一次“位置1”,并将与之关联的事件存储在其他地方,您会怎么做?这同样适用于类型部分。我无法决定如何将多个变量设置到一个位置,例如酒吧也是餐馆等......
答案 0 :(得分:2)
Locations
和Events
之间的关系是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