簡體   English   中英

Django MySQL數據庫設計

[英]Django MySQL database design

我正在嘗試在Django應用程序上優化MySQL數據庫,該應用程序提供用戶要購買的商品的搜索結果。 向我建議一種選擇是將我的Items表垂直拆分為多個表。 經過一番思考,我意識到我將表格用於三個單獨的目的:

  1. 在行中查詢與某些搜索詞相關的結果。
  2. 顯示與搜索詞相關的分頁結果。
  3. 將用戶定向到他們單擊的任何外部頁面。

據我所知,我最好的選擇是根據這些需求拆分表(這是正確的假設嗎?)。

目前,我的模型如下所示:

class Items(models.Model):
    categories = models.CharField(max_length=64)
    title = models.CharField(max_length=128)
    description = models.CharField(max_length=1024)
    thumb = models.CharField(max_length=255, unique=True)
    vendor = models.CharField(max_length=16)
    url = models.CharField(max_length=255, unique=True)

在水平分割之后,表格將如下所示:

# Query all fields in this table for the search term
class ItemSearch(models.Model):

    categories = models.CharField(max_length=64)
    title = models.CharField(max_length=128)
    description = models.CharField(max_length=1024)

# Once a set of relevant results has been compiled, query this table to get all information needed to display it on the page.
class ItemDisplay(models.Model):

    title = models.CharField(max_length=128)
    thumb = models.CharField(max_length=255, unique=True)
    vendor = models.CharField(max_length=16)
    # foreign_key referencing ItemSearch.id?

# Once a user clicks on an item they want, send them to a RedirectView associated with the products ItemDisplay.id: r'^item/(?P<item_id>[0-9]+)$' 
class ItemOut(models.Model):

    url = models.CharField(max_length=255, unique=True)
    # foreign_key referencing ItemDisplay.id?

顯然,這些表當前未鏈接,因此一旦查詢ItemSearch ,就無法在ItemDisplay中找到關聯的行,並且隨后對ItemOut做同樣的事情。

如何將這些表相互關聯?

您不應該按“目的”拆分表。 如果刪除重復項或消除冗余,則應拆分表。 此過程稱為“數據庫規范化”。

由於我無法發現任何冗余,因此我目前無法真正理解為什么要這么做。 同樣在Django中,稍后使用Django Migrations輕松執行此操作。

這里有一個“數據庫規范化”的很好的例子來理解這個概念: Django-如何規范化數據庫?

數據庫表應該根據它們之間的關系而不是按目的進行拆分(一旦事情開始變得足夠大而無法容納在一台服務器上,那么該規則可能會有例外)。

例如,“一個項目可能屬於許多類別”,或者“許多項目屬於許多類別”-這些項目將具有不同的表結構以反映關系的基數。

閱讀有關提高性能的其他答復中的評論后,拆分表不太可能帶來很多好處。

如果只想返回特定字段以減少網絡流量,請嘗試在queryset上使用values()values_list()方法。 這將與使用較小的表具有相同的效果。

https://docs.djangoproject.com/zh-CN/1.11/ref/models/querysets/#values

提高性能的明顯方法是添加一些索引,因為您似乎沒有很多。 將它們添加到的第一列將是正在搜索的列。

這是學習索引的一個非常好的資源。 http://use-the-index-luke.com/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM