4

我想知道是否有人可以指出我设置标记/通知系统的正确方向。我会说非常类似于标记系统。如果有人知道任何教程或示例设置,那就太好了。

目的

基本上,这些标志将附加到包括客户、属性、承包商、应用程序等在内的数据项上,其作用是通知用户有关该项目的重要信息。标志应该来自用户可以添加或删除的预定项目列表。

数据库

我正在考虑使用 3 表设置。

  • 标志表:可用标志的列表,以及确定这些标志适用于什么的设置(客户、属性等)。
  • 指示给定项目的链接表附加了给定标志。
  • 适当的实体表

用户界面

我希望某些功能类似于堆栈溢出的功能,例如添加和删除标签。也许为此使用jquery tag-it?主要是,我希望用户能够从下拉列表中选择标志,并在选择一个或多个标志时显示标志图标。将鼠标悬停在标志上应该会显示一个工具提示,其中列出了附加到该项目的标志。不确定一个标志的设置是否都适用于查询,而不是显示多个标志。视觉示例:http: //i232.photobucket.com/albums/ee2/nismomatic97/flag.png

4

2 回答 2

6

您的主要问题是您有任意数量的可能不同实体的标志记录,而不是单个实体(如“客户”)。

过去,我通过Foreign Key在每个表中提供一个在整个数据库中唯一的附加字段(“FlagID”)来解决这个问题。GUID 是合适的。然后,您可以简单地JOIN将适用于您的特定上下文的表添加到 Flags 表中的 FlagID,您将只获得适用于该特定实体的标志。

例如,当您JOIN将Flags 表中的FlagID 转换为Customers 表中的FlagID 时,您只会获得与Customers 相关的那些标志。

请注意,堆栈溢出没有“多实体”问题;所有标志都被投射到帖子。

于 2012-07-13T20:16:45.273 回答
3

基本上,您需要一个带有标志的表格和一个带有客户/用户的表格。这些表应如下所示:

标志表

  • 标志的唯一 ID(最简单的方法是将“ID”字段设置为AUTO_INCREMENT)。
  • 标志名称
  • 标志说明
  • 你想要的更多

用户表

  • 一个存储标志的字段(我建议存储标志的序列化数组)
  • 您需要用于其他目的的其他数据

除了存储序列化数组之外,您还可以创建另一个表来存储用户的唯一 ID 和标志 ID。每个标志一行。但是,我认为第一种方法更好,更有效。

选择和显示标志:

  • 选择一个包含序列化标志数组的字段
  • 反序列化数组并用于JOIN选择标志的名称和描述。

例子

将标志存储到用户的配置文件
假设您要存储 ID 为 1、3、5 和 7 的标志:

$flags = serialize(array(1, 3, 5, 7));
mysql_query("UPDATE `users` SET `flags` = '$flags'") or die(mysql_error());

如果要编辑标志,请选择字段,对数组进行反序列化并使用数组函数对其进行编辑。

选择和显示:
因此,您有一个值为 1、3、5 和 7 的数组。这是创建查询
的示例:SELECT

$flags = array(1, 3, 5, 7); // selected from 'users' table and unserialized
$query = "SELECT u.name, f.name, f.description FROM users u INNER JOIN flags f ON ";
$conditions = null;
for($i = 0; $i < count($flags); $i++)
{
    $conditions .= "f.id = $flags[$i] OR ";
}
$conditions = substr($conditions , 0, -4); // removing the last " OR "

$query = $query . $conditions . " WHERE u.name = 'Nikola'";

这是我们从代码中得到的查询:

SELECT u.name, f.name, f.description 
    FROM users u 
    INNER JOIN flags f 
    ON f.id = 1 OR f.id = 3 OR f.id = 5 OR f.id = 7 
    WHERE u.name = 'Nikola'

它将返回所有标志及其名称、描述和用户名。

您所要做的就是现在显示结果。


编辑 1用户界面
我不确定我是否理解您到底想要什么,但是如果您想允许每个用户使用多个标志,我建议您为每个标志或一个具有多个选择的选择菜单制作一个复选框,而不是 drop-向下。我认为下拉不是一个好主意,因为您只能选择一项。

编辑 2
您可以使用与 Stack Overflow 的标记非常相似的jQuery Autocomplete ,这可能是最佳选择。

另一个想法是您实际上可以使用下拉菜单并且仍然允许多个标志。
事情是这样的:当用户从下拉列表中选择一个标志时,通过 AJAX 将一个标志存储在 PHP 数组中,并将该数组存储在$_SESSION.

示例:通过 AJAX 向 PHP 文件发送请求,在 PHP 文件中读取$_SESSION应存储标志的变量。如果它是空的(还没有标志) - 添加一个包含 1 个键的数组。如果它不为空,则读取其值(整个数组),将新标志添加到数组并将其返回给会话变量。

session_start();

if(isset($_POST['id'])) $flagid = $_POST['id']; // previously sent request via AJAX that contains this ID.
if(empty($_SESSION['flags'])) $_SESSION['flags'] = array($flagid); // this is the first selected flag
else 
{ 
    // other tags was selected earlier
    $flags = $_SESSION['flags'];
    $flags[] = $flagid;
    $_SESSION['flags'] = $flags;
}
die("ok");

现在,回到你的 JS 文件,检查返回的结果。如果它是“ok”,则继续,如果它与“ok”不同,则显示错误。
为防止多次选择同一个标签,您可以在用户选择它时使用 jQuery 将其从下拉列表中删除(请参阅此问题)。在页面的其他位置,您可以显示选定的标志。

编辑 3:
您也可以使用<select>带有“多个”属性的。

于 2012-07-13T21:07:11.080 回答