来自事件 table 1-1 0r 的外键有多少?
Foreign key from events table 1-1 0r many?
我可能对这里的问题想得太多了,很可能会被否决,但我准备好接受打击了。我正在数据仓库中构建我的第一个模式。
2 tables:事件和联系人:
events(id(pk), cid, other, fields, here)
contacts(id (pk), cid(fk), other, fields, here)
有人访问我们的网站并注册。在事件列 "id" 中生成了一个行项目,并为联系人生成了一个 "cid"。一条新记录已添加到联系人。
我有两个问题:
- 我可以把联系人的主键设为cid吗?因此主键也是外键?
- 我正在使用 MySQL Workbench 创建架构。当我创建联系人 table 时,我可以将 cid 的外键和基数设置为 1-1 或 1-many。从联系人table的角度来看,关系是1-1还是对多?联系人中只会有 1 个 cid 记录,但如果该用户做多件事(比如收到我们的电子邮件等),他们将在事件 table 中多次出现。所以,逻辑上是一对多。但是当在 Workbench 中创建它时,关系线看起来好像是一对多关系,其中许多部分处于接触状态,而不是所需的相反方式。应该反过来吧?
events.cid和contacts.cid有什么关系?
如果用户的注册产生单个 contact_
记录,而每个用户访问网站(每个会话开始)产生属于该用户 contact_
的 event_
记录记录,那么你就有了一对多的关系。
`contact_` = parent table (the One)
`event_` = child table (the Many)
请注意我是如何将这种关系归结为一句话的。这应该是您进行分析工作以确定 table 结构时的目标。
关系几乎总是定义为从父 table 上的主键到子 table 上的外键的 link。
你如何定义primary key is up to you. First decide whether you want a natural key or a surrogate key。以我的经验,自然键永远不会奏效,因为值最终总是会改变。
如果使用代理键,请确定是什么类型。通常的选择是绑定到自动递增序列生成器的整数,或者 UUID. If ever federating data with other databases or systems then UUID is the way to go. If using an integer, decide on size, with 32-bit integers handling a total of 2-4 billion records. A 64-bit 整数可以跟踪 18 个 quintillion 记录。
子 table 中的外键只是为其分配的父主键值的副本。因此外键必须与父主键具有相同的数据类型。
如果一个特定的父记录在子记录中拥有多个记录 table,每个子记录都将携带该父记录的主键副本。因此,如果用户 Susan 有五个事件,她的主键值在 contact_
table 中出现一次,并且相同的值在存储在外部的 event_
table 中出现五次关键列。
如果 cid
在所有其他 contact_
记录中唯一标识每个 contact_
记录,那么您就有了一个主键。无需定义另一个。
我可能对这里的问题想得太多了,很可能会被否决,但我准备好接受打击了。我正在数据仓库中构建我的第一个模式。
2 tables:事件和联系人:
events(id(pk), cid, other, fields, here)
contacts(id (pk), cid(fk), other, fields, here)
有人访问我们的网站并注册。在事件列 "id" 中生成了一个行项目,并为联系人生成了一个 "cid"。一条新记录已添加到联系人。
我有两个问题:
- 我可以把联系人的主键设为cid吗?因此主键也是外键?
- 我正在使用 MySQL Workbench 创建架构。当我创建联系人 table 时,我可以将 cid 的外键和基数设置为 1-1 或 1-many。从联系人table的角度来看,关系是1-1还是对多?联系人中只会有 1 个 cid 记录,但如果该用户做多件事(比如收到我们的电子邮件等),他们将在事件 table 中多次出现。所以,逻辑上是一对多。但是当在 Workbench 中创建它时,关系线看起来好像是一对多关系,其中许多部分处于接触状态,而不是所需的相反方式。应该反过来吧?
events.cid和contacts.cid有什么关系?
如果用户的注册产生单个 contact_
记录,而每个用户访问网站(每个会话开始)产生属于该用户 contact_
的 event_
记录记录,那么你就有了一对多的关系。
`contact_` = parent table (the One)
`event_` = child table (the Many)
请注意我是如何将这种关系归结为一句话的。这应该是您进行分析工作以确定 table 结构时的目标。
关系几乎总是定义为从父 table 上的主键到子 table 上的外键的 link。
你如何定义primary key is up to you. First decide whether you want a natural key or a surrogate key。以我的经验,自然键永远不会奏效,因为值最终总是会改变。
如果使用代理键,请确定是什么类型。通常的选择是绑定到自动递增序列生成器的整数,或者 UUID. If ever federating data with other databases or systems then UUID is the way to go. If using an integer, decide on size, with 32-bit integers handling a total of 2-4 billion records. A 64-bit 整数可以跟踪 18 个 quintillion 记录。
子 table 中的外键只是为其分配的父主键值的副本。因此外键必须与父主键具有相同的数据类型。
如果一个特定的父记录在子记录中拥有多个记录 table,每个子记录都将携带该父记录的主键副本。因此,如果用户 Susan 有五个事件,她的主键值在 contact_
table 中出现一次,并且相同的值在存储在外部的 event_
table 中出现五次关键列。
如果 cid
在所有其他 contact_
记录中唯一标识每个 contact_
记录,那么您就有了一个主键。无需定义另一个。