我现在正在为我的软件编写地址簿模块。到目前为止,我已经设置了数据库,以使其支持非常灵活的地址簿配置。
我可以为每种类型创建n个条目。类型是指“电子邮件”,“地址”,“电话”等数据。
我有一个名为“ contact_profiles”的表。
它只有两列:
id Primary key
date_created DATETIME
然后有一个名为contact_attributes的表。这有点复杂:
id PK
#profile (Foreign key to contact_profiles.id)
type VARCHAR describing the type of the entry (name, email, phone, fax, website, ...) I should probably change this to a SET later.
value Text (containing the value for the attribute).
我现在可以链接到这些配置文件,例如从用户表中。但是从这里我遇到了问题。
目前,我必须为要检索的每个值创建一个JOIN。是否有可能以某种方式创建一个View,使我得到类型为列的结果?
所以现在我会得到类似
#profile type value
1 email name@domain.tld
1 name Sebastian Hoitz
1 website domain.tld
但是得到这样的结果将是一件好事:
#profile email name website
1 name@domain.tld Sebastian Hoitz domain.tld
我最初不想像这样创建表布局的原因是,可能总是要添加一些东西,并且我希望能够具有相同类型的多个属性。
那么,您知道是否有可能进行动态转换?
如果您需要更好的描述,请告诉我。
您已经重新发明了一个名为Entity-Attribute-Value的数据库设计。这种设计有很多缺点,包括您已经发现的缺点:很难以常规格式来复制查询结果,每个属性只有一列。
这是您必须执行的操作的一个示例:
SELECT c.id, c.date_created,
c1.value AS name,
c2.value AS email,
c3.value AS phone,
c4.value AS fax,
c5.value AS website
FROM contact_profiles c
LEFT OUTER JOIN contact_attributes c1
ON (c.id = c1.profile AND c1.type = 'name')
LEFT OUTER JOIN contact_attributes c1
ON (c.id = c1.profile AND c1.type = 'email')
LEFT OUTER JOIN contact_attributes c1
ON (c.id = c1.profile AND c1.type = 'phone')
LEFT OUTER JOIN contact_attributes c1
ON (c.id = c1.profile AND c1.type = 'fax')
LEFT OUTER JOIN contact_attributes c1
ON (c.id = c1.profile AND c1.type = 'website');
您必须LEFT OUTER JOIN
为每个属性添加另一个。您在编写查询时必须知道属性。您必须使用LEFT OUTER JOIN
而不是,INNER JOIN
因为没有办法使属性成为强制性的(等同于简单地声明一列NOT NULL
)。
检索存储的属性,然后编写应用程序代码以遍历结果集,为每个属性创建一个对象或关联数组的效率要高得多。您无需以这种方式知道所有属性,也不必执行n
-way连接。
SELECT * FROM contact_profiles c
LEFT OUTER JOIN contact_attributes ca ON (c.id = ca.profile);
您在评论中问,如果不使用EAV设计,如果需要这种灵活性,该怎么办?如果您确实需要无限的元数据灵活性,则SQL不是正确的解决方案。以下是一些替代方案:
EAV和任何其他替代解决方案都需要大量工作。如果您确实需要数据模型中的这种灵活性,则应该仔细考虑,因为如果您可以将元数据结构视为相对不变的话,这要简单得多。
问题内容: 假设我的数据库表结构是这样的 如果我想根据像这样的sql中的名称获取学生详细信息,请从 name =’xxx’的学生那里选择,以便在redis数据库中如何实现 问题答案: 像其他NoSQL数据存储区一样,Redis根据要执行的操作有不同的要求。 Redis有几种数据结构,根据您的需求可能有用。例如,鉴于您对a的渴望,可以使用Redis 。 如果您还有其他查询,例如您想做同样的事情但选择
向表中插入数据,记录中有一个字段涉及到当前记录是当前租户下第几个插入的,也就是顺序码,如何维护这个顺序码,在保证线程安全的情况下,不同租户的记录都保存在同一张表下, 目前的做法是插入数据的时候不插入该字段,获取该表记录列表的时候按照插入时间排序,然后判断对应字段是否为空,如果为空则插入
本文向大家介绍数据库设计的主要问题,包括了数据库设计的主要问题的使用技巧和注意事项,需要的朋友参考一下 数据库设计可能是一项艰巨的任务,您需要遵循以下方法并应对挑战,才能获得设计良好的数据库。 数据库设计的关注点和挑战如下: 遵循设计标准 在设计数据库时考虑设计标准非常重要。它为您提供了定义明确的组件。这样,您还可以轻松评估现有设计。 如果您无法遵循设计标准方法,那么不要指望设计是正确的,并且您将
问题内容: 我有桌子: 而且我需要实现“用户评论”功能(例如Facebook)。我应该以1:n关系制作table:等等吗?还是为所有人创建一张桌子(但我不知道该如何设计)? 问题答案: 您可以创建另一个表(尽管称其更好)。表中的每一行(,等等)都将引用此表中的唯一行。实体表可能具有指示实体类型的字段(以帮助反向连接)。 然后,您可以有一个以通用方式引用的表。 因此,例如,您将得到下表: 您可以在每
我刚刚开始将我的项目分离到小微服务中。我有一个处理 API 授权的微服务(检查 API 请求中提供的 apiKey 是否有效),因此为此,我有一个单独的 API 授权数据库,其中包含下表和以下架构: APIKey: ApiKey (VARCHAR, PK) TenantID (INT, FK) 租户:租户ID(INT, PK)名称(VARCHAR) 如您所见,APIKey表链接到租户表。 我有另一
我有一个PHP laravel projekt,我需要添加一个字段到一个/多个模型(雄辩)。我在php方面没有太多的经验,以前从未尝试过laravel。 现在这个班看起来像这样 我想添加一个名为“level”的字符串字段,但我不知道如何操作。如果我先在MySQL中创建字段,然后更新模型,如果我更新模型,然后Laravel为我更新MySQL? 我期待着听到我能做什么:)