[英]Advanced Database Design - Whats the most effective way to execute the following
我的想法很好,但是由于我有限的编程经验,有时我会为特定的概念想出最有效的解决方案。 目前,我的想法是尝试找出引用特定于数据类型的数据库表的最有效方法。
概念
我正在构建一个管理界面,允许站点所有者根据选定的内容“容器”“构建”内容集。 该接口当前包含各种sql数据类型,例如int,varchar,text等,并允许用户选择数据类型,对其进行标记,然后将它们链接在一起成为一个组。
然后将此组引用为数据集的实例,并且可以重用。 例如,容器“ title”和“ body”可用于构建简单页面,并且该组的每个新实例都可以是一个新页面。
问题
我遇到的问题是以尽可能有效的方式引用这些容器。 我不能简单地拥有一个包含实例ID和容器ID的表,因为无法知道它们的容器类型。 例如,content-varchar表具有id字段,然后具有varchar格式的值字段。 内容文本表有一个id字段,然后是一个文本格式的value字段。
我曾考虑过要制作一个大表来保存每种可能的数据类型,但这会浪费大量空间。 目前,一旦知道数据类型,我就使用子查询从相关表中选择特定值,但是必须有一个更好的解决方案。
您有什么想法/建议?
您正在做的事情毫无用处。
您正在艰难地重塑关系数据库。 在关系数据库中。
您不能有效地将每个小数据作为强类型关系数据进行管理。
一种选择是使用更高级别的结构(不是单个字符串,而是将多个事物绑定在一起的复合记录)。
另一种选择是仅使用文本。 更简单。 最终,当HTML发送回浏览器时,它们全部变成了文本。
“ ...各种sql数据类型,例如int,varchar,text等,并且允许用户选择数据类型,对其进行标记,然后将它们链接在一起成为一个组。”
简单类型组==行。 允许用户根据数据类型的集合自由定义表-很好-您是在使他们成为程序员。 您正在创建表格设计的前端。
顺便说一句,许多工具已经为您做到了。 RoR和Django浮现在脑海:您在数据库中定义了一行,并在页面上放置了用于定位这些元素的模板,并查看了显示如何获取该行并将其与页面匹配的函数。
要么
用字段标签和组标签标记简单的单个文本字段。 简单得多。 只需两个键即可输入文字。 您可以获取“组”,然后使用标签/值对填充模板。 在Django中,这是一行代码,用于提取行,将其转换为字典并将其传递给模板。
这是MySQL手册中有关TEXT和BLOB字段的内容:
在大多数方面,您可以将BLOB列视为VARBINARY列,该列可以根据需要任意大。 同样,您可以将TEXT列视为VARCHAR列。
翻译:使用所有TEXT或BLOB列都不会浪费空间。 MySQL将截断它不使用的内容(例如在VARCHAR中)。
除非我缺少任何东西,否则听起来并不复杂。 但这听起来确实像是要将关系数据库放入关系数据库中。 这通常是错误的处理方式。
不过,如果您坚持要说的话,请注意以下几点:
因此,听起来您将有四个表:
content_sets
: ContentSets
及其关联的元数据,例如创建每个集合的用户,集合的标题等。 content_items
: ContentItems
,以及它们所属的ContentSet
的外键。 content_types
:可以存储在每个ContentItem
中的可能类型的列表。 您的应用程序将强制执行每个项目中存储的数据是否正确。 content_groups
:的实例ContentSets
,包含实现数据和外键ContentSet
他们的一个实例。 使用属性包/ blob /文本字段存储数据本身。 这是这种实现的一个例子。 只要您有足够的理由,我就不必担心颠覆关系数据库的意图。 无论如何,此实现只使用一个表-依赖于元数据和数据实时转换为所需类型。
我必须在用户可以自行管理的商业产品的上下文中支持一组用户可扩展的属性。 废弃的替代方案包括让他们付钱给DBA修改数据库(太昂贵),生成实际表(太多失败模式)以及使用非关系数据库(大多数应用程序都需要一个关系数据库-以便进行报告等)。
在此实现中,将客户可扩展数据建模为与模型中的可扩展表绑定的键/值对,其中用户提供的元数据描述了键及其值约束。 这两个属性都是varchars。 它可以存储当时(十年前)所需的任何类型的数据:整数,浮点数,字符等。我认为它不能处理二进制图像,声音文件等。
类型,范围,大小写,未知值,特定值等的声明性约束由读取用户提供的元数据的触发存储过程处理。 转换为适当类型的操作是由同时读取元数据(不记得是哪个元数据)的应用程序或UDF处理的。
该解决方案不是很快,但是它非常灵活,可靠并且易于使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.