我们需要根据某些业务逻辑来存储和查询三种类型的项目。
\n\ncreate table a_table\n(\n item_a varchar2(30),\n item_b varchar2(16),\n item_c varchar2(2),\n -- other columns\n);\nRun Code Online (Sandbox Code Playgroud)\n\n和索引
\n\ncreate unique index idx_1 on a_table (item_a);\ncreate unique index idx_2 on a_table (item_b);\ncreate unique index idx_3 on a_table (item_c);\nRun Code Online (Sandbox Code Playgroud)\n\n特定类型的特定项目的数据将简单地读取为:
\n\n-- reading item_a\nselect ... from a_table where item_a = \'...\';\n\n-- reading item_b\nselect ... from a_table where item_b = \'...\';\n\n-- ...\nRun Code Online (Sandbox Code Playgroud)\n\n如果某项的类型为a,则它不能为b类型,因此每一行必须只有其中之一item_a,item_b或者item_c具有值,其他必须为 null。(这可以以任何方式强制执行,是否影响离子并不重要insert。)
理论上,物品类型的数量可能会增加(也许将来可能会添加第四种物品类型)。
\n\n这一事实推动了另一种解决方案,该解决方案也避免了丑陋的互斥(在给定示例中未检查)列:
\n\ncreate …Run Code Online (Sandbox Code Playgroud)