有人在SQL Server中实现了一个非常大的EAV或开放架构样式数据库吗?我想知道这是否存在性能问题以及您如何克服这些障碍.
我有一个CMS系统,可以跨表格存储数据,如下所示:
Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+
Entries META Table
+----+----------+-------+-------+
| id | entry_id | value | param |
+----+----------+-------+-------+
Files Table
+----+----------+----------+
| id | entry_id | filename |
+----+----------+----------+
Entries-to-Tags Table
+----+----------+--------+
| id | entry_id | tag_id |
+----+----------+--------+
Tags Table
+----+-----+
| id | tag |
+----+-----+
Run Code Online (Sandbox Code Playgroud)
我正在尝试实施修订系统,有点像SO.如果我只是因为Entries Table我正在计划在一个单独的表中保留该表的所有更改的副本.因为我必须为至少4个表(TAGS表不需要修改)这样做,这似乎不像一个优雅的解决方案.
你们会怎么做?
请注意,元数据表是以EAV(实体属性值)建模的.
先感谢您.
mysql database version-control revision entity-attribute-value
我是数据库设计的新手.对于cms的产品属性数据库设计有什么更好的选择?(请另外建议其他选项).
选项1:1表
products{
id
product_name
color
price
attribute_name1
attribute_value1
attribute_name2
attribute_value2
attribute_name3
attribute_value3
}
Run Code Online (Sandbox Code Playgroud)
选项2:3表
products{
id
product_name
color
price
}
attribute{
id
name
value
}
products_attribute{
products_id
attribute_id
}
Run Code Online (Sandbox Code Playgroud)
谢谢你,约瑟夫
我有一个联系消息系统的查询,我做的连接越多,指数越来越慢.
表结构基本上是联系表和联系人字段表.
查询多次加入联系人字段表,对于每次加入,它需要两倍的时间.
这是查询.
SELECT SQL_CALC_FOUND_ROWS
`contact_data`.`id`,
`contact_data`.`name`,
`fields0`.`value` AS `fields0`,
`fields1`.`value` AS `fields1`,
`fields2`.`value` AS `fields2`,
...etc...
CONTACT_DATA_TAGS(
GROUP_CONCAT(DISTINCT `contact_data_tags`.`name`),
GROUP_CONCAT(DISTINCT `contact_data_assignment`.`user`),
GROUP_CONCAT(DISTINCT `contact_data_read`.`user`)
) AS `tags`,
GROUP_CONCAT(DISTINCT `contact_data_assignment`.`user`) AS `assignments`,
`contact_data`.`updated`,
`contact_data`.`created`
FROM
`contact_data`
LEFT JOIN contact_data_tags ON contact_data.`id` = contact_data_tags.`data`
LEFT JOIN contact_data_assignment ON contact_data.`id` = contact_data_assignment.`data`
LEFT JOIN contact_data_read ON contact_data.`id` = contact_data_read.`data`
LEFT JOIN contact_data_fields AS fields0 ON contact_data.`id` = fields0.`contact_data_id` AND fields0.`key` = :field1
LEFT JOIN contact_data_fields AS fields1 ON contact_data.`id` = fields1.`contact_data_id` AND …Run Code Online (Sandbox Code Playgroud) 我正在研究一个项目.它主要用于学习目的,我发现实际上尝试复杂的项目是掌握基础知识后学习语言的最佳方式.数据库设计不是一个强项,我开始阅读它,但它的早期和我仍在学习.
这是我的alpha模式,即时通讯我只是想记下我能想到的一切,看看是否有任何问题跳出来. http://diagrams.seaquail.net/Diagram.aspx?ID=10094#
我想提出的一些问题需要反馈:
注意区域的核心属性,例如,简单地说,区域是厨房,卧室,花园,浴室和客厅.对于可能是主页,联系页面,about_us,启动画面的其他客户.它可能是2个区域,可能是100个,没有必要限制它.
我为默认值创建了单独的表,每个表都链接到一个bug.后来我来到了自定义字段的问题,如果有人想例如标记错误适用的主题,我们没有说,有可能是一个100其他的事情,所以我想坚持到一组核心属性和自定义字段给人灵活性.
然而,当我到自定义字段时,我知道我有一个问题,我不能为每个自定义字段创建一个表,所以我改为使用2个表.自定义字段和custom_field_values.这个想法是包含默认值的每个字段都将存储在此表中,并且每个字段都将链接到值表,这将只有这样的东西
custom_fields table
id project_id name
01 1 area(default)
12 2 rooms(custom)
13 4 website(custom)
custom_field_values table
id area project_id sort_number
667 area1 1 1
668 area2 1 2
669 area3 1 3
670 area4 1 4
671 bedroom 2 1
672 bathroom 2 2
673 garden 2 3
674 livingroom 2 4
675 homepage 4 1
676 about_us 4 2
677 contact 4 3
678 splash page 4 4
Run Code Online (Sandbox Code Playgroud)
这看起来像处理这样的动态字段的有效方式还是有其他替代方案?
默认值将是硬编码的,因此您可以使用它们或替换为您自己的默认值,或者我可以创建另一个表以允许用户编辑将链接到其项目的默认名称.任何反馈都是受欢迎的,如果计划中存在一些非常明显的问题,请随意批评.
mysql database-design relational-database database-schema entity-attribute-value
我一直在尝试为在线应用程序的自定义字段回答复杂的Mysql数据结构问题.我对Mysql相当新,所以任何输入都值得赞赏.
当前数据库是关系数据库,服务的每个用户将共享相同的数据库和表.
这是我正在尝试做的一个例子.
假设我正在尝试创建一个列表.此列表最多可包含30个自定义字段.用户可以在12个唯一元素之间进行选择,每个元素最多可以包含15个用户定义的属性.
每个列表在帐户内和帐户之间都是唯一的.帐户可以有多个列表,每个列表可以具有不同数量的元素以及每个元素的不同属性.
元素可以是很多东西,例如:多项选择,单选按钮,电话字段,地址,单行文本,多行文本等.
多选(复选框)元素的属性示例可以是:红色,绿色,蓝色,橙色,白色,黑色
单行文本元素的示例可以是:名字输入字段.
每个元素还必须具有用户定义的标题字段和标记字段,可以在应用程序的其他功能中引用和使用.
分割也很重要.用户需要能够基于任何元素对列表进行分段.例如,用户可能想要基于多选项元素#1中存在"红色"的所有记录来对列表"ABC"进行分段(它们可以具有多于1个列表的多项选择元素).
在这个例子中,我假设数组,EAV,序列化LOB可以正常工作.但是,我不确定在我的规模上我的需求最好的结构是什么.
实际上,每个列表最多可能有多达50,000个记录,并且实际上有20,000多个帐户 - 每个帐户都有许多列表.因此,我正在寻找最有效和灵活的结构.
为了使事情变得更加复杂,我还需要确保在任何给定时间向任何特定列表添加/删除元素的有效方法.例如,如果用户创建一个包含最大允许自定义字段数的列表(30),然后三个月后决定要删除一个字段,我需要一种方法来查找该列表以及该自定义字段的所有关联值然后删除所有值,元素类型及其属性.然后允许用户向该列表添加新元素.
我已经回顾了本网站上的许多EAV帖子,以及http://www.martinfowler.com/eaaCatalog/serializedLOB.html由于数据,EAV似乎不能满足我的需求检索缺点.
我还想知道多维阵列在这种规模下的效果如何?我相信wordpress会将它用于自定义字段.
对于这种情况如何最好地构建数据库,将非常感谢任何输入.谢谢!
这个表对mysql有什么好处吗?我希望将来能够灵活地使用这种类型的数据存储.使用此表结构,您不能使用PRIMARY KEY而是索引...
我应该更改表格的格式以包含标题 - 主键,宽度,长度,空格,耦合......
ID_NUM Param Value
1 Width 5e-081
1 Length 12
1 Space 5e-084
1 Coupling 1.511
1 Metal Layer M3-0
2 Width 5e-082
2 Length 1.38e-061
2 Space 5e-081
2 Coupling 1.5
2 Metal Layer M310
Run Code Online (Sandbox Code Playgroud) 我计划创建我的应用程序并使用ORM作为模型,但问题是,数据库的一部分使用实体 - 属性 - 值表.
我非常喜欢Doctrine ORM,但我不知道是否有可能创建类似于任何普通教义实体的类,当表实际连接到EAV风格时.
是否可以在此使用Doctrine,如果可以,如何使用?
我们正在开发一个带有SQL Server后端的.NET应用程序.客户端请求在部署应用程序后向实体动态添加自定义属性的能力.
正如在类似问题中所建议的那样,我们可以创建一个表,然后为每个自定义属性值(实体 - 属性 - 值模型)包含一行.但是,我们正在考虑允许最终用户实际修改表(也在同一问题中建议),即添加和删除列.
(编辑:如评论中所述,DDL不会由用户或应用程序直接执行,而是通过存储过程确保一切顺利运行)
主要原因是:
我们应该注意哪些警告?
想到的事情是:
select * from table以包含任何添加的列).关于这种方法的任何意见都非常感谢.
如果我有一个应用程序需要能够根据用户输入更改数据库模式,我正在尝试决定走哪条路.
例如,如果我有一个包含汽车属性的"汽车"对象,例如年份,型号,门等,那么如何以这种方式将其存储在数据库中,用户应该能够添加新属性?
我读到了有关EAV表的内容,他们看起来似乎是对的,但问题是,当我尝试获取由一组属性过滤的汽车列表时,查询会变得相当复杂.
我可以动态生成表吗?我看到Sqlite支持ADD COLUMN,但是当表达到许多记录时它有多快?看起来似乎没有办法删除列.我必须创建一个没有要删除的列的新表,并从旧表中复制数据.这在大桌子上肯定很慢:(
mysql ×5
database ×3
sql-server ×2
ddl ×1
doctrine ×1
dynamic ×1
field ×1
orm ×1
performance ×1
php ×1
revision ×1
schemaless ×1
sql ×1
sqlite ×1