我应该首先澄清查询和索引不是彼此的替代品。
创建表时,会定义列,其中一些列可以定义为 FOREIGN KEYS,与另一个表中的其他列相关。表之间的关系仅用于参照完整性目的(如果引擎支持)。它对于文档目的也很有用,一些查询设计者使用它们来猜测查询中的连接。
索引(或索引)用于不同的目的。他们告诉数据库创建一个额外的数据结构,服务器可以根据索引列的值加速行的检索。
因此,外键定义表之间的关系,查询连接相关表,索引加速查询中的连接、过滤、分组和排序操作。
编辑:表格用于表示一种实体。因此,我们可以有一个具有两个属性的颜色表:colors(color_name, color_value)。Color_value 可以是十六进制字符串或整数表示。原则上,我们不会有格式为 rgb(x,y,z) 的颜色代码列,因为这总是可以从第一个开始计算的。
我们将有另一个表来保存图像列表。但是,颜色表和图像表之间没有关系。
编辑 2:第二种类型通常用两个表格表示。第一个表存储典型的层次关系,第二个表告诉每个颜色标记的类。因此,您提供的示例的关系模型将是:
colors(colorid, color_name, color_value)
color_classes(classid, classname, parentid)
colors_classes(colorid, classid)
e.g.,
(colorid, color_name, color_value) - colors
(1, 'Navy', 'xxx')
(classid, classname, parentid) - color_classes
(1, 'All colors', 0)
(2, 'Dark colors', 1)
(3, 'Light colors', 1)
(4, 'Jewel Tones', 2) -- assuming Jewel Tones is a subdivision of Dark Colors
(colorid, classid) - colors_classes
(1, 4) -- assuming Jewel Tones is a subdivision of Dark Colors
您还应该知道,递归关系(如在 color_classes 中)在关系模型中没有得到很好的处理,但它们仍然很常见,并且有解决方案来处理它。
最后,我不确定关系模型是否确实最适合您的问题。这将取决于您想要对数据进行的用途。