【发布时间】:2017-07-30 21:22:34
【问题描述】:
只是有一个关于编写 SQL 的问题。
在 ORACLE DB 中,我在一个“APPLE”表中有一排不同的苹果,其中“TAGS”包含此类苹果的所有特征。例如:
NAME, TAGS
-----------
APPLE1, FUJI BOXED MEDIUM CALIFORNIA ...
APPLE2, ORGANIC GALA PER_POUND LARGE FLORIDA ...
APPLE3, RED_DELICIOUS MEDIA PACKED ORGANIC ...
APPLE4, LARGE RED_DELICIOUS Mexico ....
APPLE5, PACKED FUJI MEXICO LARGE
现在我想要一个 SQL 查询来找出具有任何给定标记值的所有行,例如“FUJI MEDIUM MEXICO”。这个 SQL 会是什么样子?
这与我正在进行的一个项目有关。在 DB 中,我之所以有一个“标签”列来保留所有特征,而不是单独的列,是因为我们知道将引入越来越多的新标签值,所以我们不会添加越来越多的列,而是喜欢将它们放在一列中,这样代码就不需要每次都更改。
谢谢,
杰克
【问题讨论】:
-
“我打破了第一个范式,现在查询我的数据库真的很难。”不开玩笑?看,许多数据库设计原则在一天结束时都非常灵活。通过创建多值字段来打破第一范式不是其中之一。它变得非常丑陋并且非常慢非常快。是的,像@JeffUK 这样更好的设计意味着您必须编写不会创建带有子查询等重复行的查询,但是 SQL 和数据库引擎都非常擅长这种类型的查询!他们都非常不擅长将一个字段分解为多个字段!
-
我应该打印该评论并将其粘贴在我工作的开发部门:)
-
请:在您提出问题之前,请在 Google 上搜索您问题的许多简洁、清晰、具体的版本。如果你问,用一个作为标题。将您的标题中的单词移动到标签中,如果它们是多余的,则将它们从您的标题中删除。这个标题对任何人都没有用。 PS 一个正确的设计没有单独的标签列,它有一个标签列,它的行说“事物名称被标记为标签”。阅读信息建模和数据库设计的一些介绍。
-
进一步@BaconBits 点,有效标签表将允许您建立参照完整性,目前您容易受到排版错误的影响;和使用不同风格的人。例如。 RED_DELICIOUS vs RedDelicious,Spain vs Espana vs España 等等。