【问题标题】:Identifying the rows of my table with 'type' column用“类型”列识别我的表的行
【发布时间】:2018-03-17 11:29:37
【问题描述】:

假设我有 3 个表:

用户 - 图片 - 产品。

Tables

看起来是这样的。我如何轻松识别该行是针对用户还是针对产品的。

我的第一个解决方案是在图像/封面表中命名一个 (ID) 并让它引用 2 个表并添加一个具有 字符串数据类型'type' 列,然后只存储 'user'和/或'product' 字符串,以确定'id'user_id 还是product_id

除了将 2 个表引用到一个外键的明显错误之外。我的想法还有其他问题吗?

也许我可以添加两个(ID)。即user_idproduct_id 并将两者都声明为NULL。我将能够确定该行属于哪个表。

如果 user_id 的值为 '1'product_idNULL,则该行属于用户。

用于插入用户封面/图像的示例控制器/型号代码 sn-p。

控制器:

$insert['user_id'] = $this->user_id;
$insert['product_id'] = NULL;
$insert['original'] = $image_name;
$insert['thumbnail'] = $this->upload->data('raw_name').'_thumb';

$image_id = $this->model->insert_cover($insert);

if($image_id > 0){//do something }

型号:

public function insert_cover($data){
$query = $this->db->insert('cover/image', $data);
if($query){ return $this->db->insert_id(); }else{ return 0; }
}

我有将图像上传到我的项目文件夹'/assets/uploaded_images/' 的默认要求,但我想将所有产品图像显示为 200x200 并将所有用户图像显示为 100x100 所以我使用codeigniter中的image_lib对上传的原始图片进行大小调整,调整后的图片自动命名为'_thumb'后缀。

然后我将原始文件和缩略图的文件名存储到我的数据库中,当在我的视图上显示它们时,我只需添加一个 url 字符串

$cover = 'http://localhost/project_name/assets/uploaded_images/'.$file_name

无论如何,我可以在这里应用什么方法来轻松识别该行属于哪个表?

我是否选择 2 具有 NULL 值的 id?我要添加一个字符串形式的“类型”列吗?

但为什么我觉得它俗气/松散?每当我插入一些我必须添加的东西时:

$insert['type'] = 'user';

我认为这是因为我无法控制“类型”列。

如果我添加另一个名为 image_typecover_type 的两列表会怎样。即type_idtype_name

然后,每当我插入图像表时,我都必须先查询'type' 列。

//inserting user image/cover

    $type = $this->model->check_type('user');

    if($type != NULL){ 
    // do something 
    }

    public function check_Type($type){
    $this->db->select('type_id');
    $query = $this->db->get_where('image_type', array('type_name' = $type));
    if($query->num_rows() > 0){
    foreach($query->result() as $row){
    $type = $row->type_id;}
    return $type;
    }else{ return NULL; }

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    为 userId 和 productId 设置 2 列并不是一个很好的解决方案,因为这将有很多 NULL 值,使用 type 列可以避免这些值。此外,如果不为每种图像类型添加新列,它将不允许您添加更多图像类型。

    如果您只有很少的图像类型并且不打算添加更多图像类型,那么没有单独表格的type 列解决方案是一个好主意。如果您想通过从代码中引用它们来添加更多内容(只要它们不是太多),您甚至可以使用此解决方案。

    如果您想要一个可以轻松用于添加更多图像类型的通用解决方案,那么拥有单独表格的解决方案是这 3 个解决方案中最好的。

    话虽如此,您可以使用 JSON 列将多个图像路径保存在与实体相同的表中(较新版本的 MySQL 允许查询 JSON 数据。您可以在此处找到更多信息The JSON datatype

    【讨论】:

    • 这让我回到了将单个外键引用到 2 个表的问题。如果我要划掉 2 个具有空值的外键的解决方案。
    • 您是否检查过我提到的 JSON 数据类型作为可能的解决方案?
    • 我在 w3school 上查过。我可以这样存储它吗?使用 php。 $insert['id'] = { 'user_id':$user_id, 'product_id':NULL } 但那仍然是 1 列引用 2 个表。还是个问题。
    • 不,我的意思是在每个实体表中使用JSON 列。例如:用户表有一个图像JSON 列,产品表也是如此。在保存功能中,您只需选择正确的表并保存值。当您获取图像、选择正确的表格并获取时也是如此。
    • 如果我只添加一个名为 images 的新表,并带有 image_id、original、thumbnail 就足够了。那么在用户或产品表中,只需添加一个 image_id 列?
    猜你喜欢
    • 2022-01-23
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多