James Asked: 2021-09-30 07:44:28 +0800 CST2021-09-30 07:44:28 +0800 CST 2021-09-30 07:44:28 +0800 CST 数据库设计的实体关系 772 客户可以选择不提供评论或留下尽可能多的评论,但他们不能对同一产品有多个评论。我该如何建模? database-design erd 1 个回答 Voted Best Answer bbaird 2021-09-30T09:30:07+08:002021-09-30T09:30:07+08:00 在开始之前,让我们解决当前数据模型的一些问题: 这不是关系数据模型。你没有钥匙。您已经定义了表之间的指针,仅此而已。 因为这不是一个关系模型,所以实现某些关于基数的约束更难建模,更不用说强制执行了。 这导致我们: ID 本身不是键 每个人都喜欢在表格上添加自动递增的整数并将它们称为键。它们是行指针,仅此而已。密钥保证数据的唯一性,并且Ids不是数据,它们是由系统生成的。 例如,在您当前的数据模型中,可以将完全相同的信息插入Product表中,直到我用完整数。没有钥匙。 ID 可以是键,但只能作为另一个键的补充 您示例中的主键Product很可能类似于(ProductCategory, ProductName, Color). 这相当宽(以字节为单位),因此将该键降级为备用键并使ProductId1成为表的主键是合理的。 在这种情况下,我们说它ProductId是原始主键的代理项。 将客户限制为每个产品 1 条评论 在您的问题的上下文中,主键Review是(ProductId, CustomerId). 如果我们尝试插入由相同Product作者撰写的相同评论的两条评论Customer,这将违反主键并且插入将失败。 作为一个好处,我们可以放弃无用的Id列,这意味着我们不需要额外的索引来访问Review给定的Product2 其他注意事项 ProductCategory应该是它自己的表,并且Product应该对该表具有外键约束以强制一致性。 现在 anOrder只能完成一个Product. 通常这是在(primary key )Order之后实现的,这将允许 a以不同的价格出售(对销售/折扣有用)。OrderLine(OrderId, LineNbr)Product 我知道这只是一个例子,但是为了所有神圣的事物的爱,不要将信用卡信息存储在Customer表中。ACustomer可以有多种付款方式,无论如何,将数据加密并放在访问权限非常有限的表中会更安全。 1更好的密钥应该是ProductCd反映制造商零件代码、条形码或某些内部指示符(业务内部,而不是数据库)的密钥。 2您仍然需要一个索引CustomerId,以便更快地访问特定的评论Customer。
在开始之前,让我们解决当前数据模型的一些问题:
这导致我们:
ID 本身不是键
每个人都喜欢在表格上添加自动递增的整数并将它们称为键。它们是行指针,仅此而已。密钥保证数据的唯一性,并且
Ids
不是数据,它们是由系统生成的。例如,在您当前的数据模型中,可以将完全相同的信息插入
Product
表中,直到我用完整数。没有钥匙。ID 可以是键,但只能作为另一个键的补充
您示例中的主键
Product
很可能类似于(ProductCategory, ProductName, Color)
. 这相当宽(以字节为单位),因此将该键降级为备用键并使ProductId
1成为表的主键是合理的。在这种情况下,我们说它
ProductId
是原始主键的代理项。将客户限制为每个产品 1 条评论
在您的问题的上下文中,主键
Review
是(ProductId, CustomerId)
. 如果我们尝试插入由相同Product
作者撰写的相同评论的两条评论Customer
,这将违反主键并且插入将失败。作为一个好处,我们可以放弃无用的
Id
列,这意味着我们不需要额外的索引来访问Review
给定的Product
2其他注意事项
ProductCategory
应该是它自己的表,并且Product
应该对该表具有外键约束以强制一致性。现在 an
Order
只能完成一个Product
. 通常这是在(primary key )Order
之后实现的,这将允许 a以不同的价格出售(对销售/折扣有用)。OrderLine
(OrderId, LineNbr)
Product
我知道这只是一个例子,但是为了所有神圣的事物的爱,不要将信用卡信息存储在
Customer
表中。ACustomer
可以有多种付款方式,无论如何,将数据加密并放在访问权限非常有限的表中会更安全。1更好的密钥应该是
ProductCd
反映制造商零件代码、条形码或某些内部指示符(业务内部,而不是数据库)的密钥。2您仍然需要一个索引
CustomerId
,以便更快地访问特定的评论Customer
。