【问题标题】:mysql innodb basic design for joomla componentjoomla组件的mysql innodb基本设计
【发布时间】:2011-10-15 13:34:38
【问题描述】:

我有四个实体:

  • 居中
  • 活动
  • 地址

所以我的想法是:

  • 一个人可能有一个关联的地址。
  • 一个中心可能有一个关联的地址。
  • 一个活动可能有一个关联的地址。

这个 mysql 设计对于 joomla 组件是否正确?

CREATE TABLE `#__person` (
`id` int(10) NOT NULL AUTO_INCREMENT,
other fields...
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `#__center` (
`id` int(10) NOT NULL AUTO_INCREMENT,
other fields...
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `#__activity` (
`id` int(10) NOT NULL AUTO_INCREMENT,
other fields...
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `#__address` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`line1` varchar(30),
`line2` varchar(30),
`locality` varchar(10),
`region` varchar(10),
`country` varchar(10),
`postcode` varchar(10),
`person_id` int(10),
`center_id` int(10),
`activity_id` int(10),
PRIMARY KEY (id),
FOREIGN KEY `person_id` REFERENCES `#__person` (id) ON DELETE CASCADE,
FOREIGN KEY `center_id` REFERENCES `#__center` (id) ON DELETE CASCADE,
FOREIGN KEY `activity_id` REFERENCES `#__activity` (id) ON DELETE CASCADE,
other fields...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

也就是说:

  • 如果我删除一个人,他/她对应的地址会自动被删除吗?
  • 如果我删除一个地址,他们的引用会怎样? (希望没有)
  • 如果同一个地址是一个中心和一个活动的地址,会发生什么?
  • 外键是否在正确的表中,或者我应该在 person、center 和 activity 中添加 address_id 字段吗?

我对我的设计有点困惑。

感谢您的建议。

【问题讨论】:

    标签: mysql joomla foreign-keys innodb


    【解决方案1】:

    我建议不要将人员、中心和活动的 id 放入地址表中,而是将 address_id 放入其他每个表(人员、中心和活动)中。然后,您可以在其他表以及人员、中心和活动的不同组合中重复使用相同的地址。

    关于级联,我认为MySQL Reference manual explains it well

    CASCADE:从父表中删除或更新行,并且 自动删除或更新子表中的匹配行。 支持 ON DELETE CASCADE 和 ON UPDATE CASCADE。之间 两个表,不要定义几个 ON UPDATE CASCADE 子句 在父表或子表的同一列上。

    因此,如果您确实将 address_id 更改为在其他每个表中,然后您应用了外键约束

    FOREIGN KEY `address_id` REFERENCES `#__address` (id) ON DELETE CASCADE
    

    然后,当您删除地址表中的行(没有外键约束的行)时,人、中心或活动(定义外键的位置)中的匹配行将被删除。但是,我猜这可能不是你想要的,因为你说一个人、中心和活动“可能”有一个地址。因此,如果您删除了地址,您不一定要删除使用该地址的人员、中心或活动。如果这是真的,那么我会将 3 个表中的每个表中的外键约束更改为:

    FOREIGN KEY `address_id` REFERENCES `#__address` (id) ON DELETE SET NULL
    

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多