【问题标题】:Implementing association tables实现关联表
【发布时间】:2011-07-14 21:31:41
【问题描述】:

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

这是一个例子:

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

如果您希望“位置 1”仅在数据库中存在一次,并且与它相关的事件存储在其他位置,您将如何处理?这同样适用于类型部分。我无法决定如何将多个变量设置到一个位置,例如酒吧也是餐厅等...

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    “位置”和“类型”之间的关系是多对多关系的一个示例。这意味着一个位置可以有许多类型,并且一个类型可以与许多位置相关。这些类型的关系通常使用链接表来实现,其中包含相关行的外键。链接表通常有两个外键的复合主键,这意味着一个位置不能链接到'bar'类型两次。

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

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

    要跨多个表查询信息,您必须使用联接。对于一对多关系,以下查询将起作用:

    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
    

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

    【讨论】:

    • 好的,所以当我替换丢失的变量时,有一个 sql 查询将创建这些关联?我肯定会对此进行更多搜索,但这非常有帮助。
    【解决方案2】:

    假设该类型是位置的类型

    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
    

    【讨论】:

    • 嗯,我应该将上述内容作为查询运行?我仍然对这些关系究竟是如何运作以及从那里去哪里感到困惑。
    • 我的“参考”指参考文献。您定义的外键(如果您的引擎允许)将一个表的列“绑定”到另一个表的引用列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多