Database design 数据库设计,处理特定于记录和任意数量的订单相关数据
请容忍我,因为我还在学习。本质上,从抽象的角度来说,我有一组数据,可以很容易地放入1NF或2NF中,但也有一些项目数量不同,我希望与记录关联,其中必须保持顺序。请注意,我不关心任何特定的数据库或语言,只关心解决这个问题的基本方法和理论 为了简化到最基本的元素,我有一个ID、一个目标和完成目标所需的任务。对于这个例子,我排除了其他字段,如Name(string)、Section(string)等,因为它们很容易处理 起初,我认为可能只有5个任务,因为对数据集的随意一瞥似乎表明大约有2-3个任务(字符串)。我的代码中的顺序暗示为1->2->3,依此类推Database design 数据库设计,处理特定于记录和任意数量的订单相关数据,database-design,database-schema,Database Design,Database Schema,请容忍我,因为我还在学习。本质上,从抽象的角度来说,我有一组数据,可以很容易地放入1NF或2NF中,但也有一些项目数量不同,我希望与记录关联,其中必须保持顺序。请注意,我不关心任何特定的数据库或语言,只关心解决这个问题的基本方法和理论 为了简化到最基本的元素,我有一个ID、一个目标和完成目标所需的任务。对于这个例子,我排除了其他字段,如Name(string)、Section(string)等,因为它们很容易处理 起初,我认为可能只有5个任务,因为对数据集的随意一瞥似乎表明大约有2-3个任务(字
ID(键)、目标(字符串)、Task1、Task2、Task3、Task4、Task5
我马上就不喜欢了,因为有一半的值最终都是空的,但它有点起作用了,我正在学习其他一些东西,比如如何从我的脚本语言调用SQL。然后我开始看到有6个、7个和8个任务的目标(我是否只是根据需要随机添加更多列,从而增加存储的空值的百分比?不,这不是一个好主意
所以我想知道,我是否只是将所有任务塞进一个字段,并指定一个分隔符?然后我就可以使用拆分和联接或regexp来格式化数据。在本例中,我的任务由1-3个[a-Za-z']
标记组成,因此处理起来非常简单
ID(键)、目标(字符串)、任务(字符串)
其中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键
主表
:
123, "Name1", "Goal1"
456, "Name2", "Goal2"
789, "Name3", "Goal3"
123, "Task1"
123, "Task2"
123, "Task3"
123, "Task4"
123, "Task5"
456, "Task2"
456, "Task3"
456, "Task4"
789, "Task3"
789, "Task4"
789, "Task5"
任务表
:
123, "Name1", "Goal1"
456, "Name2", "Goal2"
789, "Name3", "Goal3"
123, "Task1"
123, "Task2"
123, "Task3"
123, "Task4"
123, "Task5"
456, "Task2"
456, "Task3"
456, "Task4"
789, "Task3"
789, "Task4"
789, "Task5"
在这一点上,我的直觉是,我的思维出现了可怕的错误。我已经失去了确保顺序得到维护的能力。任何特定ID所需的所有任务的查询都可能导致任何顺序。它还存储了大量冗余数据。至少我去掉了空值?但这不好
在这一点上,还有其他一些问题困扰着我,这可能应该在设计的早期就解决。但我正在努力自学,边走边学习。所以我开始了,开始了一段切线
有很多冗余的文本数据,因为这些任务描述是恒定的。所以我想知道如何最好地优化这些数据,以最大限度地减少磁盘使用,并提高速度,而不会使代码混乱,产生太多的脚本开销。我的一个想法是创建一个枚举表
枚举:ID(键)、任务(字符串)
好吧,至少不用到处存储字符串,我可以存储一个小得多的整数。即使它们是最坏情况下的64位整数,也就是8字节,仍然比我要存储的字符串小。我的代码将读取枚举,存储在运行时,并用它来引用字符串
不确定这是否是一种有效的技术,是否有更好的方法来解决这个问题,甚至不知道它叫什么。索引?或者这是不同的吗?或者这是一些数据库可以自动完成的吗
无论如何,回到主要问题,如何处理我的任意顺序相关任务列表?为每个主记录创建一个表,每个表都有自己的顺序(键)和任务(字符串/int/enum)项?对于开销来说似乎更糟
在我看来,这似乎是一个基本问题,并且有一些标准的解决方法。在我有限的预算、缺乏书籍、连接速度慢以及谷歌无休止地向我发送消息的情况下,我想我会要求任何提示。任何免费的在线参考资料(特定网站或文章)也欢迎使用。你的短语“订单必须维护”至少意味着两件不同的事情
这可能意味着必须在存储时维护订单,方法是将新项目放置在能够保持其有序的位置
这也可能意味着必须在检索时通过以正确的顺序检索项目来维护订单
如果你指的是上面的第二件事,那就相当简单了。你还需要一个列,这个列将明确正确的顺序。例如,孩子们可以按姓氏(字母)或年龄,或体重(数字)排序。书籍可以按书名或图书馆检索号排序
然后,当您想要检索项目时,只需在执行检索的SQL查询中包含“order by”子句即可。无论这些项目以何种顺序存储,它们都将按照您指定的顺序交付
通过创建适当的索引,可以大大加快检索过程。代价是添加新项目的速度会稍微慢一点,索引会占用一些磁盘空间
在某些情况下,需要多个列来指定正确的顺序
但这涵盖了最简单的情况。你的想法是正确的