为 Rails 3 项目创建一个非常通用的数据模型有什么好处吗?
一个产品可以有很多关于它的内容,我将它们称为属性。它可以有一个简短的描述。但该描述可以采用多种语言。同样,它可以有多个价格,其中一些价格是特定于客户的。给出以下数据:
Product:
identifier: 123-ABC
Price:
value: $1.25
currency: USD
customer: Wal-Mart
Price:
value: $1.96
currency: USD
Description:
short: "A Widget"
language: EN
Description:
marketing: "Made from Space Age Polymers."
language: EN
在这里使用 STI 并制作一组通用模型是否有意义:
Product has_many Properties
Property has_many Attributes
Price < Property
Description < Property
Package < Property
这种数据模型的泛化方式是否过于广泛?我应该坚持使用常规模型及其关联的表格吗?
A Product can have lots of things said about it, I'll call them Properties. It can have a brief description. But that description can be in multiple languages. Likewise, it can have multiple Prices, some which are specific to Customers. Given the following data:
Product:
identifier: 123-ABC
Price:
value: $1.25
currency: USD
customer: Wal-Mart
Price:
value: $1.96
currency: USD
Description:
short: "A Widget"
language: EN
Description:
marketing: "Made from Space Age Polymers."
language: EN
Does it make sense to use STI here, and make a generic set of models:
Product has_many Properties
Property has_many Attributes
Price < Property
Description < Property
Package < Property
Is this way too broad of a generalization in the data model? Should I just stick with regular models and their associated tables?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不。
说真的,
不。
至少在 SQL 数据库中不是。
如果您想使用 Cassandra 或 NoSQL 数据库,这正是所有内容的存储方式。
在此处阅读我的答案
和
阅读此内容 包含名字、姓氏和出生日期的 SQL 表
查找所有超过 30 岁的 LNAME = 页面。
在一个表中,它是
SELECT FNAME, LNAME, (SYSDATE - BDATE)/365 年龄
来自人
WHERE LNAME = '页面' 且 BDate < SYSDATE - 30*365
现在在 EAV 中尝试一下,
发布您的答案。
No.
Seriously
No.
at least not in a SQL database.
If you want to use Cassandra or a NoSQL database, that's exactly how everything is stored.
Read my answer here
and
Read this
Think of a SQL Table with First Name, Last Name, and Birth date
Find all the LNAME = Page older than 30.
in one table it's
SELECT FNAME, LNAME, (SYSDATE - BDATE)/365 age
FROM people
WHERE LNAME = 'Page' and BDate < SYSDATE - 30*365
Now try it in an EAV
Post your answer.