我想在数据库中存储具有可变数量属性的某些项目.
例如:
项目可以具有"url"和"pdf"属性,而其他项目则不具有"图像"和"位置"属性.
所以问题是一些项目可以有一些属性和其他很多.
你会如何设计这个数据库.如何使其可搜索和高效?
架构会是什么样子?
谢谢!
我们有一个通用的数据库模式,我们用于系统中的一些表.主要原因是我们运行的是多租户数据库,因此并非所有用户都需要相同的字段.但是,我不知道这种模式的"正确"名称是什么.
以下是我们的一个表格可能如下所示的示例:
ClientID | SurveyID | AnswerKey | AnswerVal ------------------------------------------- 1 | 1 | Fname | Fred 1 | 1 | Lname | Flintsone 1 | 1 | Email | Fred@flintstone.com 1 | 2 | Fname | Mickey 1 | 2 | Lname | Mouse 1 | 2 | Phone | 555-3343
我们一直称它们为"垂直表",但我不知道这是否正确.
我正在尝试在使用实体 - 属性 - 值模型来存储对象的数据库中进行搜索.有人能告诉我下面的查询有什么问题吗?
SELECT * FROM object a
INNER JOIN object_meta b
ON a.id = b.object
WHERE
a.name LIKE '%michael%' AND
b.name='type' AND b.value='judge'
AND (
(b.name='country' AND b.value='France')
OR
(b.name='country' AND b.value='Sweden')
)
ORDER BY a.name DESC
LIMIT 0, 50;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想选择名称中包含"michael"且属于判断类型的对象,来自瑞典或法国.我可以看到它在浏览数据库时存在与查询匹配的对象,但在运行查询时没有任何结果.我正在通过命令行运行查询,因此它与应用程序代码无关.
表结构
object
+----+------------+
| id | name |
+----+------------+
| 1 | Michael... |
| 2 | Michael... |
+----+------------+
object_meta
+--------+---------+-----------+
| object | name | value |
+--------+---------+-----------+
| 1 | type | judge …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个监控系统.在我们的系统中,值由不同服务器上运行的代理报告.报告的观察结果可以是如下值:
我们希望存储这些观察结果(这些观察结果不会提前知道,并且会在不重新编译的情况下动态添加到系统中).
我们正在考虑在观察表中添加不同的列,如下所示:
IntMeasure -> INTEGER
FloatMeasure -> FLOAT
Status -> varchar(255)
Run Code Online (Sandbox Code Playgroud)
因此,如果我们要存储的值是一个数字,我们可以根据类型使用IntMeasure或FloatMeasure.如果值是状态,我们可以存储状态文字字符串(如果我们决定添加状态(id,name)表,则存储状态ID).
我们假设有可能有一个更正确的设计,但由于连接和动态表名取决于类型,可能会变得缓慢和黑暗?如果我们无法在查询中预先指定表,那么联接将如何工作?
表A.
id,parentID, key, value
1, 2, name, name1
2, 2, age, 20
3, 2, place, place1
50, 7, name, namex
51, 7, age, 20
52, 7, place, place1
........
101, 5, name, namez
102, 5, age, 23
103, 5, place, place2
Run Code Online (Sandbox Code Playgroud)
我需要以波纹管格式获得plave = place1和age = 20的所有日期
parentid, name, age, place
2, name1, 20, place1
7, namex, 20, place1
Run Code Online (Sandbox Code Playgroud)
如何编写Mysql SQL查询请帮帮我
我目前正在讨论一些关于网站想法的东西 - 我非常想让我的用户创建"Tables"来保存数据,然后允许他们查询这些数据(以比写作更怪异的方式) SQL查询,希望比使用excel更容易).
到目前为止,我的想法是使用几个表在我的数据库中表示它 - 有一个表代表一个表,一个表代表表的列,有一个表代表表中的每一行,最后一个代表值.类似于(PSEUDO SQL)的东西:
CREATE TABLE 'Tables' (
Id INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255)
)
CREATE TABLE 'TableColumns' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
NAME VARCHAR(255)
)
CREATE TABLE 'TableRows' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
RowNumber INT NOT NULL
)
CREATE TABLE 'TableValues' (
RowId INT NOT NULL PRIMARY KEY,
ColumnId INT NOT NULL PRIMARY …Run Code Online (Sandbox Code Playgroud) 我注意到Magento会将URL保存到您在core_config_data表格中设置的每个商店使用的徽标.
如果我运行这个SQL:
SELECT *
FROM core_config_data`
WHERE path = 'design/header/logo_src'
Run Code Online (Sandbox Code Playgroud)
我得到了商店列表及其相关徽标.我也得到了一个config_id和一个scope_id.
我希望能够在幕后以编程方式更新这些徽标,但我无法弄清楚如何将此表的数据与商店名称相关联.
config_id并store_id以某种方式链接回另一个建立关系的表.Magento的EAV模型,呃:)
有任何想法吗?
我最近一直在与Pylons做一些工作,非常像SQLAlchemy数据库交互模型.我的网站有一部分,我认为可以从EAV架构中受益.
使用它作为我的表示例:
id | userid | type | value
---+--------+--------|------------
1 | 1 | phone | 111 111 111
---+--------+--------|------------
2 | 1 | age | 40
Run Code Online (Sandbox Code Playgroud)
我可以手动运行以下查询来提取和更新数据:
SELECT value FROM table WHERE userid=1 AND type='phone'
UPDATE table SET value=41 WHERE userid=1 AND type='age'
Run Code Online (Sandbox Code Playgroud)
这很容易并且有效...但是手动构建查询不是我的首选方法.我想使用SQLAlchemy来创建我的表模型并让它完成所有的工作.
如果我使用标准架构,每个架构都有type自己的列,我可以执行以下操作:
class People(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
userid = Column(Integer, ForeignKey('users.id'))
phone = Column(Unicode(40))
age = Column(Integer)
Run Code Online (Sandbox Code Playgroud)
然后我可以使用以下方法提取数据:
data = Session.query(People).filter_by(id=1).first()
print data.age
Run Code Online (Sandbox Code Playgroud)
我希望能够为我的EAV架构做同样的事情.所以基本上,我需要一种方法来扩展SQLAlchemy并告诉它,当我调用data.age它实际上意味着,我想要SELECT value FROM table …
我需要将键值对保存在PostgreSQL数据库中,该数据库将具有有关记录的一些基本信息。
在对该主题进行了一些搜索之后,我发现hstore是选项之一。但是即使查阅了文档,我也无法弄清楚如何在带有hstore列的表中添加记录,以及如何在结果中返回它们以及如何解析它。
我对PostgreSQL完全陌生,因此任何代码参考都很棒。
我一直在阅读有关EAV数据库的信息,大多数缺点似乎都与真的,真的,错误的EAV设计或从数据生成报告的难度有关。
通常,当您看到人们抱怨EAV时,他们使用少于三个的表来尝试复制RDBMS中单独的表+列的功能。有时,这意味着将所有内容(从小数到字符串)都存储在单个TEXT值列中。EAV还会破坏数据完整性的安全保护措施,如果您不小心的话,这可能会很糟糕。
但是,EAV确实提供了一种轻松的方式来跟踪历史数据,并允许我们在SQL和键值存储系统之间来回移动系统的某些部分。
如果我们根据类型区分不同的实体属性该怎么办。除了与特定属性和实体相关的正确索引值之外,这还使我们仍然可以处理belongsTo,Has,HasMany和HasManyThrough关系。
考虑以下两个基本实体
products (price -> decimal, title -> string, desc -> text, etc...)
attributes
options
[...]
int
datetime
string
text
decimal
relation
[id,foreign_key]
users (gender -> options, age -> int, username -> string, etc...)
attributes
options
[...]
int
datetime
string
text
decimal
relation
[id,foreign_key]
Run Code Online (Sandbox Code Playgroud)
众所周知,用户资料和产品是世界上最多样化的产品。每个公司处理它们的方式都不一样,并且针对他们的需求具有不同的“列”或“属性”。
以下是如何处理多个(嵌套和/或关系)实体的视图。
想法是,对于每个实体都有此主属性表,然后该主表指定如何查找和解释这些值。这使我们能够处理特殊情况,例如指向其他实体的外键以及诸如“选项”或十进制数字之类的东西。
entity_type {id,type,//即“博客”,“用户”,“产品”等。created_at}
entity {
id,
entity_type_id,
created_at
}
attr {
id,
entity_id,
type,
name,
created_at
}
option {
id,
attr_id, …Run Code Online (Sandbox Code Playgroud)