1

我有一个系统,它有(为了一个简单的例子)由客户、供应商、产品、销售等组成的表。目前共有 24 个表。

我想为这些表中的每条记录添加多个注释的功能。例如,每个客户记录可以有 0 到多个注释,每个供应商记录可以有 0 到多个注释,等等。

我的想法是我想要一个“Notes”表,由 Noteid 和日期/时间戳索引。实际的音符数据将是 varchar(255)。

我正在寻找一种创造性的方式来将源表双向绑定到 Notes 表。拥有 24 个外键类型交叉引用表或 24 个 Notes 表的想法并没有真正吸引我。

使用 Apache 服务器在 PHP 中进行编程。数据库是 mysql/InnoDB。

对创意持开放态度。

谢谢

拉尔夫

4

4 回答 4

1

我建议这样的桌子

note_id  :  int autoincrement primary
type_id  :  int, foreign key from f Customers, Vendors, Products etc 
type     :  varchar, code indicating the type, like Vendors, VENDORS or just V 
note     :  varchar, the actual node


CREATE TABLE IF NOT EXISTS `notes` (
  `note_id` int(11) NOT NULL AUTO_INCREMENT,
  `type_id` int(11) NOT NULL,
  `type` varchar(20) CHARACTER SET utf8 NOT NULL,
  `note` varchar(255) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`note_id`)
) 

通过这样的设置,您可以为每种类型(例如供应商)设置多个注释,并且还可以为多种类型保存注释。

数据样本

note_id     type_id     type          note
--------------------------------------------------------------------
1           45          Vendors       a note 
2           45          Vendors       another note
3           3           Customers     a note for customer #3
4           67          Products      a note for product #67

SQL 示例

select note from notes where type="Vendors" and type_id=45

为了减少表的大小,我更喜欢类型的别名,比如,V等等。PC

于 2013-09-27T15:31:47.807 回答
0

不要做一个“通用”表,例如

id、source_table、source_record_id、note_text

在实践中可能听起来不错,但是如果不编写动态 SQL,您就不能将此表与其他表连接起来。

最好为每个表简单地添加一个专用的注释字段。这消除了对动态 sql 的任何需求,并且如果您使用 varchar/text 字段,额外的空间使用量将是最小的,因为它们无论如何都不会存储在表中。

于 2013-09-27T15:30:05.507 回答
0

在我使用这样的格式之前,我已经完成了这样的结构:

id (int)
target_type (enum/varchar)
target_id (int)
note (text)

然后每个数据元素只需要查询它自己的类型,因此对于您的客户对象,您可以像这样查询附加到它的注释

SELECT * FROM notes where target_type='customer' AND target_id=$this->id

您还可以将 target_type 链接到实际类,以便使用 get_class($this) 写入数据库以填写目标类型,在这种情况下,Note 类中的单个函数可以接收您拥有的任何其他对象类型。

于 2013-09-27T15:30:11.807 回答
0

在我看来,没有一个干净的解决方案。

选项 1:主实体表

每个(相关)表的每个(相关)行在表内都有一个主条目(我们称之为它entities_tbl。每个派生表的 id 不是自动增量,而是引用主表的外键。

现在您可以轻松地将 notes 表与主实体 id 链接起来。

PRO:这是一个面向对象的想法。就像一个基础“对象”类,它是所有其他类的父亲。此外,每个实体在数据库中都有一个唯一的 ID。

CON:这是一团糟。每个实体 ID 都分散在(至少)两个表中。您每次都需要 JOIN,并且主实体表将是巨大的(它将包含与所有其他子表的总和相同的行数,合并)

选项 2:元属性

在 notes 表中,主键将包含一个自动增量,entity_id 和 item_table_name。这样,您可以轻松地从任何表格中提取任何实体的注释。

PRO:易于编写,易于填充 CON:它需要元值来提取实际值。没有外键来授予引用完整性、混乱和草率的连接、表名作为 where 条件。

选项 3:数据库非规范化

(叹气,我从来没有考虑过提出这个建议)在每个需要注释的表中添加一列。将注释存储为 json 编码字符串。(这意味着对数据库进行非规范化,因为您将引入非原子值)

优点:编写简单快速,即使对于未来的数据库用户也使用某种形式的标准,笔记是集中的,并且可以从每个实体轻松访问 缺点:数据库未标准化,笔记之间的搜索和比较差

于 2013-09-27T15:30:48.627 回答