Concurrently در postgresql چه معنی می دهد ؟

درود دوستان من در مورد concurrently یک جستجو کردم و به داکیومنتش یعنی
https://www.postgresql.org/docs/9.1/static/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY

رسیدم که اینطوری توضیح می ده :

When this option is used, PostgreSQL will build the index without taking any locks that prevent concurrent inserts, updates, or deletes on the table; whereas a standard index build locks out writes (but not reads) on the table until it’s done. There are several caveats to be aware of when using this option — see Building Indexes Concurrently.

من این متن رو خوندم ولی هیچی نفهمیدم ازش که چه فرقی با ایندکس دیفالت می کنه . من در تنظیمات میگریشن در elixir ecto دیدم جالب شد برام که دقیقا چه کاری رو انجام می ده ؟

1 پسندیده

این برای ساخت ایندکس
در محیط پرداکشن همیشه از index concurrently استفاده کن اگر این کارو نکنی index سازی معمولی تا زمانی که index ساخته نشده جدول قفل میکنه ولی بصورت concurrent قفل نمیشه جدول ولی بیشتر طول میکشه

1 پسندیده

ممنون سام عزیز . منظورت به این صورت اقدام کنم درسته ؟

create index(:posts, [:slug], concurrently: true)

بله درسته

1 پسندیده

سام عزیز می شه این موضوع رو به صورت یک مثال بگی؟ با توضیحاتی که فرمودید یک چیزایی متوجه شدم ولی یک چیزی هم متوجه شدم اینکه من همیشه باید از concurrently در کل پروژه هام استفاده کنم یا اینکه هر کدوم در یک کاری استفاده می شند ؟
اگر مثال بزنید ممنونت می شم تشکر

1 پسندیده

همیشه از concurrently استفاده کن ساختن index روی داده زیاد مثلا چند میلیون داده میتونه ساعت ها طول بکشه
و اگر concurrently نباشه اون جدول را تا ایندکس ساخته نشه نمیشه استفاه کرد چون قفله

1 پسندیده

سام عزیز شما یک بار در یک پستی به همراه توماج فرمودید که

و همینطور صحبت توماج عزیز

آیا ایندکس کردن یک uuid که مشتق شده از حروف و اعداد هست , چرا بهتر است ؟ نسبت به id ؟ یک کتابخونه دیفالت هم روی پروژه فونیکس و الکسیر هست برای ساخت این UUID.uuid1() که فکر کنم نظر شما دو بزرگوار نیز همین بوده باشه

1 پسندیده

ایندکس کردن id با uuid فرقی نداره خوبیه uuid اینکه همیشه uuid متفاوته و تصادف داده نداری اگر بخواهی به چند دیتابیس ارتقا بدی کلی دردسر کم میکنه

2 پسندیده

علاوه بر چیزی که سام گفت، id چطور میتونه بین دوتا table از دوتا دیتابیس یونیک‌باشه؟
و‌آیا id 1 در همه دیتابیس ها برای یک یوزر مشابه میتونه باشه؟
id یک فیلد auto increment هست، uuid یک فیلد رندم درست شده

2 پسندیده

سعی کن به ایندکس به صورت دستی هم حتما name بدی که بعد ها با مشکل رو برو نشی. Explicit index name

index(:posts, [:slug], concurrently: true, name: "index_posts_on_slug")

حالا یک مورد هم که بد نیست اینجا اشاره کنم اینه که بهتره همه فیلد ها mandatory باشند یعنی (null: false) مگر اینکه دلیل خیلی خیلی خیلی خوبی برای mandatory نبودن هر فیلد داشته باشی.

در ضمن بنظر میاد slug باید unique index باشه، من مدلینگ شما رو نمیدونم فقط یه حدس بود

1 پسندیده

توماج جان تشکر تشکر تشکر . خیلی ممنونم ازت . یک سوال داشم یک سری فیلم ها هستند که نیاز نیست کاربر بر اساس اجبار پر کنه مثلا نام کمپانی یا شرکتی که داره توش کار می کنه می خواد هر وقت دیگه پر کنه . اینو من بیام مثلا

add :company_name, :string, size: 40, null: false

بزنم و گفتم نول نباشه پس باید بیام default: " " بهش بدم درسته ؟

تو جوملا می خواستیم یک افزونه بنویسیم انقدر درگیر ریز مسائل مثل اینا نبودیم :sweat_smile: تازه دارم قدرشو می دونم

پیوست

هنوز انتقال ندادم به دیتابیس چون رلیشنم مشخص نشده هنوز و همینطور از نظرات شما عزیزان + داکیومنت دارم استفاده می کنم ولی این جداولی هست که تاحالا ساختمش

defmodule TrangellUsersService.Repo.Migrations.UsersInfo do
  use Ecto.Migration

  def change do
  	create table(:usersinfo) do
        add :uuid, :string, size: 120, default: UUID.uuid1()
        add :full_name, :string, size: 40, null: false
        add :email, :string, size: 70, null: false
        add :password, :string, size: 150, null: false
        add :password_hash, :string, size: 150, null: false
        add :last_ip, :string, size: 20, null: false
        add :last_token, :text, default: "0", null: false
        add :group_acl, :string, size: 50, null: false
        add :company_name, :string, size: 40, null: false
        add :site_address, :string, size: 40, null: false
        add :language, :string, size: 3, null: false
        add :country, :string, size: 20, null: false
        add :state, :string, size: 20, null: false
        add :age, :integer, size: 3, null: false

        timestamps()
    end

    create index(:usersinfo, [:uuid], concurrently: true, name: :index_of_users_uuid, unique: true)
    create index(:usersinfo, [:email], concurrently: true, name: :index_of_users_unique_email, unique: true)
  end
end

default: " "؟ اگر این کارو بکنی احتمالا نتونیم دوستای خوبی باشیم :cry:
در جوملا هم فرقی نمیکنه بازم موارد مشابه هستند, باید مدلینگ و اپلیکیشن جدا از هم دیده بشند.

من در یک قسمتی عرض کردم مگر اینکه دلیل خوبی برای mandatory نبودن هر فیلد داشته باشی, سعی کن برای الزامی کردن فیلد ها تصمیم گیری نکنی, بلکه برای الزامی نبودنشون تصمیم بگیری. در مورد فیلد هایی که business میگه الزامی نباشند DB چکارست که " " بزاره جاشون؟

بعضی ها میگن اینکار یعنی mandatory کردن همه بجز اونهایی که نباید, side effect زیادی ایجاد میکنه, بنظر من side effect بهتر از خرابی دیتاست

3 پسندیده

برای بعضی فیلد ها میتونی default بزاری مثل boolean flag ها اما نه برای مثلا company name

3 پسندیده

آخریو نادیده بگیر پاکش کردم

1 پسندیده

تصحیح میکنم, وقتی length رشته رو میدونی و از یه حدی بیشتر نیست varchar بزاری efficient تر هست

2 پسندیده

ممنون توماج جان . کلا گفتم چون استرینگ ۲۵۵ هست فکر کنم باشه اگر بعدا خواستم محدودیتشو بگیرم . البته ورچر پیدا نکردم محدودیتش چی هست داخل الکسیر یا کوچکتر از این دو مورد داره یا نه. البته الان شما اسمشو گفتید من دیدم چرا نزاشتم بهش توجه نکرده بودم ممنون بخاطر تذکر

زیاد در مورد نوع فیلد ها صحبت نکرده در داکیومنت ecto قسمت میگریشنش.

من با راهنمایی شما و همینطور سام عزیز اومدم کد هامو ویرایش کردم منظور قسمت ساخت جداول از میگریشن هست . بیشتر دنبال محدود کننده های جداول هستم . یک نوع دیدم تو داکیومنت . که نمی دونم اگر جدول خالی باشه ارور می ده یا نه . چون ممکن جدولش خالی باشه ولی اگر خالی نبود بیشتر از مثلا ۱۰ باشه .


یا مورد دیگه نمی دونم هست تو این ecto مثلا می شه گفت پسورد کمتر از ۱۰ حرف نباشه یا نه . اون size فقط می گه تا این مقدار باشه . شاید باید در کد قسمت ارسال به دیتابیس ولید کنمش

1 پسندیده

ببخیشد همزمان دارم چنتا کار انجام میدم اشتباه زیاده :smiley:

1 پسندیده

ممنون از شما که وقت می زارید تشکر بسیار زیاد .
ممنونم .

1 پسندیده

بله باید بشه, اگر هم نشد sql constraint

1 پسندیده

من الان یک مشکلی پیدا کردم . من خیلی مجبور هستم تو پروژه ام uuid رو سرچ کنم به همین منظور می خواستمش ایندکسشم بکنم به علاوه ایمیل .

uuid من هم پرایمری کی منم هست

تو این آموزش اومده

مثلا به این صورت عمل کرده

defmodule MyApp.MyMigration do
  use Ecto.Migration
  def change do
    create table(:companies, primary_key: false) do
      add :id, :uuid, primary_key: true
      add :title, :string
      timestamps()
    end
  end
end

بعد اومده در فایم schema گفته خودکار جنریت کنه به این صورت

  @primary_key {:id, :binary_id, autogenerate: true}

ولی باز بعدش اومده گفته

company = %Company{id: Ecto.UUID.generate(), title: "Acme"}
Repo.insert!(company)

خوب اگر خودکار جنریت می شه پس چرا باز داره واردش می کنه . و سوال دیگه بهتر نیست id هم باشه من یک فیلد دیگه ای هم درست بکنم به نام uuid و همینطور مشکلی ایجاد نمی شه پرایمری کی هم ایندکس باشه هم پرایمری کی؟

کد فعلی خودم

defmodule TrangellUsersService.Repo.Migrations.UsersInfo do
  use Ecto.Migration

  def change do
  	create table(:usersinfo, prefix: "shahryar", primary_key: false) do
  		add :id, :uuid, primary_key: true
        add :full_name, :string, size: 40, null: false
        add :email, :string, size: 70, null: false
        add :password, :string, size: 150, null: false
        add :password_hash, :string, size: 150, null: false
        add :last_ip, :string, size: 20, null: false
        add :last_token, :text, default: "0", null: false
        add :group_acl, :map, size: 50, null: false
        add :company_name, :string, size: 40
        add :site_address, :string, size: 40
        add :language, :string, size: 3, null: false
        add :country, :string, size: 20, null: false
        add :state, :string, size: 20, null: false
        add :age, :integer, size: 3

        timestamps()
    end

    create index(:usersinfo, [:id], concurrently: true, name: :index_of_users_uuid, unique: true)
    create index(:usersinfo, [:email], concurrently: true, name: :index_of_users_unique_email, unique: true)
  end
end
1 پسندیده