【发布时间】:2019-04-26 22:10:45
【问题描述】:
我正在为电子商务环境中的 Customer 实体开发 MySQL(通过 Prisma 数据模型)架构。随着字段数量的爆炸式增长(包括参与度跟踪),我在这里有两种可能的设计:
type Customer {
email: String! @unique
name: String
birthDate: DateTime
addresses: [Address!]!
...
productsVisited: [Product!]!
productsShared: [Product!]!
productsSearched: [Product!]!
...
}
应该将传递信息的字段或字段一起划分到自己的表中,并通过一对一的关系连接到前一个表:
type Customer {
profile: CustomerProfile! @relation(name: "CustomerProfile", onDelete: CASCADE)
addresses: [Address!]!
...
productEngagements: ProductEngagement! @relation(name: "CustomerProductEngagements", onDelete: CASCADE)
...
}
type CustomerProfile {
customer: Customer! @relation(name: "CustomerProfile", onDelete: SET_NULL)
email: String! @unique
name: String
birthDate: DateTime
}
type ProductEngagement {
customer: Customer! @relation(name: "CustomerProductEngagements", onDelete: SET_NULL)
productsVisited: [Product!]!
productsShared: [Product!]!
productsSearched: [Product!]!
}
问题:
这里的正确设计思维方式是什么?我目前由我的 ER 图和直觉驱动。通过使表格变薄 w.r.t,我是否会获得或失去任何执行或灵活性优势?列数?
在第二种方法中,查询是否需要为表连接做额外的工作?
抽象问题:
考虑到不断发展的模式或性能标准,一种方法肯定比另一种更好吗?或者,这只是口味问题?
【问题讨论】:
-
将两个数据库表以 1:1 的关系通常是糟糕的设计。如果您提供
CREATE TABLEs,从数据库的角度来看,我可能有更具体的 cmets。 (或者我可以同意做 1:1。) -
嗨@Rick,我理解你的意思,并且我得出了相同的结论,即在应用程序服务器级别而不是在数据库中更好地进行分组列的抽象。我请求您将您的设计观点作为纯粹的 RDBMS 技术答案提供,详细说明“为什么选择 X”,以便我可以学习逻辑并接受它。 (另外,我没有 CREATE TABLEs,因为我使用的是 Prisma ORM API)。非常感谢;期待您的回答!
-
如果您正在转向实体-属性-值模式模式,我建议您查看 EAV 标签;有充分的理由避免它。
-
@RickJames 我已经经历过 EAV 发布警告,但仍然选择在我的产品-变体关系中使用它(仅)。 [在这种情况下人们对它更轻:)]
-
用户和 MySQL 之间可能有一百多个第三方包。我无法开始跟上他们。也许我见过一次graphql,但从来没有见过棱镜。我在这个论坛上花了很多时间帮助用户学习 MySQL,因为他们选择的包未能充分地将他们与 MySQL 隔离开来。祝你好运。
标签: mysql orm graphql entity-attribute-value prisma