我与其他同学一起设计软件,允许用户上传有关某个区域的历史数据,然后根据其他列信息过滤该数据。每组数据的列信息可以完全不同。例如,我们有一个大型CSV,其中包含有关1700年代后期居住在费城的人的信息,包括以下列:
职业,寡妇,非洲,地址,评论
地址是集合中唯一的常见属性。
我认为我们应该为每个数据集创建一个新表,因为我们无法知道将来会有哪些列或将有多少列。明天有人可以上传文件,有关鸡农的信息,以及
等栏目有鸡蛋,有棕色鸡蛋,小麦,地址,苹果
我只知道自己教过的东西,但是其他同学告诉我,从哲学意义上说,每套新表格都是 dirty 。唯一的竞争设计是具有多个通用“属性”列的单个表,这些列与元信息/描述属性的另一个表保持分开。
我很难看到为每一套制作一张新桌子的缺点,但我对MySQL的街头教育没有足够的信心为它提供强有力的理由 - 如果有更好的方法可以做到这一点。我只被告知它是反数据库(不是那些条款 - 我的队友很棒,我只是想了解。)
似乎使用单独的表可以让我们选择特定的数据类型(varchar
,datetime
等),并在运行实际语句之前将查询限制为相关数据。 Plus ,如果我们获得包含许多列的数据集,则替代解决方案将需要新的通用列,即使先前/未来的集合再也不需要它。我理解(部分)他们的推理并认为它会起作用 - 但我很难看到看似更多工作带来的好处。
这样做有“正确”的方法吗?
编辑: 过滤最终用于使用Google的Maps API绘制地图上的点。地址编码的代码大部分已经完成。
答案 0 :(得分:0)
如果您要过滤它(我认为您不能做更多的事情),将所有内容放在一个表中,并添加一个额外的列(外键)到另一个具有集合名称的表(如果用户想要集合中的所有数据。
我建议将所有内容放在一个表中,因为它听起来,感觉并且看起来像是在尝试使用来自不同来源的数据构建某种数据仓库,这些数据库之间并不一致。
您可能希望为未填充的列创建默认值,但这很大程度上取决于您将如何使用数据。
答案 1 :(得分:0)
您是要查询那些与数据集不同的字段到数据集还是仅显示信息?如果它只是用于显示,您可以将所有信息放在一个字段中。如果你需要查询它,这是一个坏主意。您也可以使用EAV表,在这种情况下,我可能想知道关系数据库是否是此信息的最佳选择(除了地址之外)。我会为此调查一个没有sql的数据库。 或者你可以为每种信息做一个表并加入他们。在这种情况下,我不确定它会有效,因为你会有这么多的并且不知道哪一个sto加入任何一个查询。
答案 2 :(得分:0)
正确的方法是使用EAV(实体 - 属性 - 值)方法。关于如何为MySQL实现这一点有很多信息。
无论如何,如果您必须搜索/过滤该数据,您可以为其构建搜索索引,或者为具有相似属性集的每个数据集建立单独的搜索表。
例如,您可以拥有以下表格:产品, 属性 值。
为了实现快速有效的搜索,我们可以创建并定期重新构建特殊搜索索引或具有特定产品集的公共属性的单独搜索表,例如:
search_tools, search_furniture, search_otheritems