اول اینکه آیا توی این فریم ورک رفتاری مثل TimestampBehavior برای فیلدهای یاد شده داریم که کاربر سازنده و تغییر دهنده رکور رو خودش اتوماتیک مقدار دهی کنه؟ یا همچنان باید از متدهای beforsave() و … کمک بگیریم؟
و سؤال دوم اینکه ما تو اکثر جداولمون به صورت پیشفرض از این فیلدها استفاده میکنیم. آیا نیاز هست که برای این فیلدها هم کلید خارجی تعریف کنیم؟
اگه جواب مثبته؟ راهی هست که از تکرار جلوگیری کنیم به طوری که یه جا این کلید خارجی رو تعریف کنیم روی تمامی جداول اعمال بشه؟
اگه جواب منفیه؟ توی ساختار دیتابیس مشکلی ایجاد نمیکنه؟ یعنی اگه مقدار یکی از رکورهای مربوط به این فیلدها دستی توی دیتابیس عوض بشه سازگاری داده ها دچار مشکل نمیشه؟؟
یک behavior وجود داره به اسم AttributeBehavior که دقیقا برای همین کار استفاده میشه. اینکه مقدار یک فیلد مشخص رو در یک event مشخص مثل beforeSave تعیین کنید. اصلا خود TimestampBehavior هم از همین behavior ارث یری کرده و بر همین اساس کار میکنه
AttributeBehavior
در جواب قسمت دوم، بله راه بهترش این هست که از کلید خارجی استفاده کنید چون در لایه معنایی اینها کلید خارجی هستند دلیلی نداره که در پیاده سازی این ارتباط برقرار نشه.هرچند حتما میدونید که Yii نیازی به تعریف کلید خارجی در لایه دیتابیس نداره و با همون relation ها در اکتیو رکورد میشه این رو شبیه سازی کرد. اما اگر کلید خارجی نباشند همونطور که گفتید سازگاری داده ها به خطر میفته
من راهی سراغ ندارم که به صورت rule تعیین کنه که فلان فیلدها از جداول مختلف همگی کلید خارجی به یک فیلد از یک جدول خاص هستند. راستش به نظر من اگر برای ساخت جداول migration مینویسید این اصلا مشکل دردسر سازی نخواهد بود، فقط یک خط کد php در کلاس migration هر جدول هست.
ضمنا این گزینه رو هم مدنظر داشته باشید که میشه این فیلدها رو از جداول مختلف خارج کرد و اصلا یک زیر سیستم لاگ پیاده کرد که در یک جدول همه ی تراکنش هارو ذخیره میکنه. مثلا خبر شماره ۱۲ توسط کاربر با شناسه ۳ ویرایش شد. اگر با کلیدواژه audit trail جستجو کنید به نمونه های مشابه میرسید