请容忍我,因为我还在学习。本质上,在抽象的术语中,我有一组数据,可以很容易地放入1NF或2NF中,但也有一些项的数量不同,我希望将这些项与必须保持顺序的记录相关联。请注意,我并不关心任何特定的数据库或语言,只关心解决这个问题的最基本的方法和理论。
为了简化到最基本的元素,我有一个ID,一个目标,以及完成目标所需的任务。在本例中,我排除了Name (string)、Section (string)等其他字段,因为它们很容易处理。
起初,我想,也许永远只会有5个任务,因为随便看一下数据集,似乎表明大约有2-3个任务(字符串)。我的代码中的顺序暗示为1、->、2、->、3等等。
ID (key), Goal (string), Task1, Task2, Task3, Task4, Task5
我马上就不喜欢这样了,因为一半的值最终都是空的,但它还是挺管用的,而且我还在学习其他一些东西,比如如何从我的脚本语言中调用SQL。然后我开始看到有6,7和8个任务的目标。:(我是否需要继续随机添加更多的列,从而增加存储的NULL的百分比?不是的。这不是个好主意。
所以我想知道,我是不是应该把所有的任务都塞进一个字段,然后指定一个分隔符呢?然后,我可以只使用split和join或regexp来格式化数据。在本例中,我的任务由1-3个[A-Za-z ']
标记组成,所以很容易处理。
ID (key), Goal (string), Tasks (string)
其中,Tasks
的形式为task1,task2,task3,...
这件事似乎让我很困扰。如果我同时处理多个目标,并且想要获得需要应用相同任务集的所有名称的列表,该怎么办?例如,假设我有:
123, "Name1", "Goal1", "task1,task2,task3,task4,task5"
456, "Name2", "Goal2", "task2,task3,task4"
789, "Name3", "Goal3", "task3,task4,task5"
现在查找所有需要task3
的记录会变得多么混乱?也许我可以使用LIKE来找到我想要的东西?看起来像是对这个功能的可怕滥用。在脚本中处理逻辑,看起来更加混乱、低效、难以维护。例如,更改所有task3
条目或更改任务的顺序都不太好。
在桶里射鱼和在菜板上用刀都可以用来做寿司……
因此,我想知道如何将任务数据放在单独的表中,共享相同的ID键。看起来像这样。
Main Table
123, "Name1", "Goal1"
456, "Name2", "Goal2"
789, "Name3", "Goal3"
Tasks Table
123, "Task1"
123, "Task2"
123, "Task3"
123, "Task4"
123, "Task5"
456, "Task2"
456, "Task3"
456, "Task4"
789, "Task3"
789, "Task4"
789, "Task5"
在这一点上,我的直觉是我的思维出了可怕的问题。我已经失去了确保秩序得以维持的能力。对任何特定ID所需的所有任务的查询可能会导致任何顺序。它还存储了大量冗余数据。至少我摆脱了NULLs?但这并不是什么好事。
在这一点上,一些其他的东西正在困扰着我,这可能是应该在设计早期解决的。但我在努力自学,边学边学。所以我开始了,离题了。
有很多冗余的文本数据,因为这些任务描述是常量。所以我想知道如何优化它,最大限度地减少磁盘使用,提高速度,而不会因为太多的脚本开销而使代码变得混乱。我的一个想法是创建一个枚举表。
Enumerations: ID (key), Task (string)
1, Task5
2, Task4
3, Task3
4, Task2
5, Task1
6, Task10
7, Task9
8, Task8
9, Task7
10, Task6
and so on.
好吧,至少我可以存储一个小得多的整数,而不是到处存储一个字符串。即使它们在最坏的情况下是64位整数,那也是8个字节,仍然比我要存储的字符串小。我的代码将读取枚举,存储在运行时,并使用它来引用字符串。
不确定这是否是一种有效的技术,是否有更好的方法来解决这个问题,或者甚至不确定它被称为什么。索引?或者这是不同的东西?或者这是一些数据库可以自动完成的事情?
无论如何,回到主要问题,如何处理我的顺序依赖任务的任意列表?为每个主记录创建1-off表,每个表都有自己的ORDER (key)和Task (string/int/enum)条目?对于开销来说似乎更糟。
在我看来,这似乎是一个基本的问题,并且有一些标准的方法来解决它。在我有限的预算,缺乏书籍,缓慢的连接,以及谷歌无休止地让我无处可去的情况下,我想我应该向他们请教一些建议。任何免费的在线参考知识来源(特定的网站或文章)也欢迎。
发布于 2013-10-21 00:01:30
你的短语“订单必须被维护”至少意味着两个不同的东西。
这可能意味着必须在商店时间通过将新项目放置在将其保持有序的位置来维护订单。
这也可能意味着在检索时必须通过以正确的顺序检索项来维护顺序。
如果你指的是上面的第二件事,那就相当简单了。您还需要一个列,该列将使正确的顺序显式显示。例如,可以按姓氏(按字母顺序)或按年龄或按体重(按数字)对儿童进行排序。图书可以按书名排序,也可以按图书馆检索号排序。
然后,当您想要检索这些项目时,只需在执行检索的SQL查询中包含"order by“子句。无论它们以什么顺序存储,都将按照您指定的顺序进行交付。
通过创建适当的索引,可以大大加快此检索过程。这样做的代价是添加新项的运行速度会稍慢一些,并且索引将占用一些磁盘空间。
有些情况下,需要多个列才能指定正确的顺序。
但这涵盖了最简单的情况。
https://stackoverflow.com/questions/19457368
复制相似问题