我正在使用 MySQL 和 MyISAM 表。
我有一堆我想组合在一起的对象
- 1 个对象属于 1 个且仅属于 1 个组
- 1组可以有很多对象
- 1 组有 1 个必需的主要对象,我将手动选择
到目前为止,我已经建立了一个我认为是正确的模型。
但我不知道如何对组中的主要对象进行建模。什么是完美的解决方案?
group_object
----------------
group_object_id (PRIMARY KEY)
name
object
----------------
object_id (PRIMARY KEY)
group_object_id (FOREIGN KEY)
name
更新了我的问题.. 看到粗体
由于表使用 MyISAM 存储引擎,我有两个建议。
建议 #1:使用插入顺序
最简单的方法是首先为给定的组任意插入主对象。
展望未来,您将运行如下查询:
每个组的主要 object_id
每个组的主要对象按名称
结语
为确保第一条规则
1 object belongs to 1 and only 1 group
,添加此索引在这两列上有一个唯一索引,并且
object_id
绝对可以防止在组中插入object_id
两次。GROUP BY
这种独特的方式会像我提到的那样加快查询速度。它还可以加快组中对象的收集速度,如下所示:和
建议 #2:在同一个表中使用两个 auto_increments
所有查询
SUGGESTION #1
仍然适用,但设计略有不同。设计
object
表格如下:object_id
MyISAM 将处理所有per的增量值group_object_id
。目前只有MyISAM存储引擎有这个能力。我之前讨论过这个:Apr 21, 2012
:如何在一个表中有两个自增列?Apr 30, 2013
:将 MyISAM 表转换为 InnoDB 的问题(自动列问题)试试看 !!!
更新 2013-08-28 02:05 EDT
记得我说过
例子
假设您运行以下命令来创建表
并加载表
您将拥有以下数据:
如果您运行我的查询,请注意您如何从每个组中获取主要对象
请注意每个组的主要插入对象如何具有该组的最小 object_id。
当您应用我首先提到的规则时,只需从表中
object_id
查找任何给定的最小值。group_object_id
object
您的最后编辑
添加标志
如果您的对象表中已经有数据并且想要分配一个随机对象作为主要对象,您可以在对象表中添加一个名为
main
as的标志INT NOT NULL DEFAULT 0
。承担责任后,您必须在插入时检查一个组是否已经有一个主要对象。如果是这样,您会将main
前一个主对象的标志更新为 0。然后,您可以将另一个对象的标志更新main
为 1。重新排列以更改主要对象
如果您尝试遵守我的规则,首先插入是主要的,这是您可以执行的操作,以便您可以选择哪个对象成为组中的第一个:
例子
比方说我的例子,你想接受
OBJ_Z
并GROUP2
使它成为新的主要对象。你会这样做:如果你运行这段代码,这里是新的输出
请注意,这
OBJ_Z
是主要对象,因为它是组中的第一个。只需在第一行中查询要成为 main 的对象的名称,然后运行所有代码。我反复尝试过,它有效。试试看 !!!